巧用枚舉類型,實現項目的多語言切換


在項目程序中實現多語言,有多種方式,而枚舉類型的多語言處理,是比較頭疼的問題。比如有下面這個枚舉類型:

 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:女,男

 

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

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

 

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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM