巧用列舉型別,實現專案的多語言切換
在專案程式中實現多語言,有多種方式,而列舉型別的多語言處理,是比較頭疼的問題。比如有下面這個列舉型別:
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:女,男
最後,當我們需要部署中文或者因為的程式,只需要修改這個條件編譯符合,重新編譯這個包含列舉的程式集即可。
列舉方式的多語言問題,是不是很簡單?
如果是愛思考的同學,可能會問,我修改了包含列舉型別定義的程式集的條件編譯符號,為何主程式可以正常使用而不報錯?
這就涉及到編譯器對列舉型別的處理行為了,列舉型別在編譯時,是直接替換成列舉項的值的,所以使用列舉型別的時候,是不能隨意更改列舉項的順序和值的,也不能隨意減少列舉專案,否則可能出現錯誤。