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