1. 程式人生 > 其它 >巧用列舉型別,實現專案的多語言切換

巧用列舉型別,實現專案的多語言切換

在專案程式中實現多語言,有多種方式,而列舉型別的多語言處理,是比較頭疼的問題。比如有下面這個列舉型別:

 public enum MySex
    {
        Women = 0,
        Man = 1
    }

如果想在介面上輸出這個列舉項,直接的做法如下處理:

Console.WriteLine("Sex:{0},{1}",MySex.Women,MySex.Man);

程式輸出:

Sex:Women,Man

如果我們想輸出列舉項的中文名稱,怎麼辦呢?

通常的做法是這樣:

 public enum MySex
    {
[Description("女")]
        Women = 0,
[Description("男")]
        Man = 1
    }

然後反射列舉項,拿到特性申明的內容,大概使用的樣子可能是這樣的:

Console.WriteLine("Sex:{0},{1}",GetEnumDescription<MySex>(MySex.Women),

                                                 GetEnumDescription<MySex>(MySex.Man));

GetEnumDescription 函式是一個使用反射獲取列舉項描述的功能,具體實現略。

有沒有發現,現在這種使用方式,已經違背了我們使用列舉的最初形式了?多加了一個方法呼叫。

有沒有更好的方式?

有,就是定義一箇中文的列舉型別:

  public enum MySex
    {
        女 = 0,
        男 = 1
    }

但是,這樣在專案中同時定義了2次性別列舉型別,肯定編譯不過。怎麼辦呢?

這是,.NET的“條件編譯”神器出場了。

為了管理程式碼方便,我們在專案裡面新增2個檔案:

  • Enum_Lan_En.cs
  • Enum_Lan_Zh.cs

En的檔案表示英語的列舉定義檔案,Zh表示中文的列舉定義檔案,在這2個檔案中,分別這樣定義列舉:

Enum_Lan_En.cs:

namespace MyEnum
{

#if(Lan_En)

    public enum MySex
    {
        Women = 0,
        Man = 1
    }

#endif

}

Enum_Lan_Zh.cs:

namespace MyEnum
{

#if(Lan_Zh)

    public enum MySex
    {
        女 = 0,
        男 = 1
    }

#endif

}

此時,需要在程式集上指定一個條件編譯符合,具體在

專案屬性-》生成-》常規-》條件編譯符號: 輸入

Lan_En

這樣,我們在主程式裡面按照下面的樣子使用列舉,即可正常編譯使用:

Console.WriteLine("Sex:{0},{1}",MySex.Women,MySex.Man);

當然,如果你想在主程式裡面使用中文列舉,也沒有關係,在

專案屬性-》生成-》常規-》條件編譯符號: 輸入

Lan_Zh

即可。

Console.WriteLine("Sex:{0},{1}",MySex.女,MySex.男);

程式輸出:

Sex:女,男

最後,當我們需要部署中文或者因為的程式,只需要修改這個條件編譯符合,重新編譯這個包含列舉的程式集即可。

列舉方式的多語言問題,是不是很簡單?

如果是愛思考的同學,可能會問,我修改了包含列舉型別定義的程式集的條件編譯符號,為何主程式可以正常使用而不報錯?

這就涉及到編譯器對列舉型別的處理行為了,列舉型別在編譯時,是直接替換成列舉項的值的,所以使用列舉型別的時候,是不能隨意更改列舉項的順序和值的,也不能隨意減少列舉專案,否則可能出現錯誤。