2010-05-25 156 views
5

我見過很多關於將字符串映射到枚舉的問題和答案,反之亦然,但是如何將一系列本地化的字符串映射到枚舉?如何國際化表示C#枚舉值的字符串?

我應該只是創建一個extension method like this從資源文件返回正確的字符串?有沒有一種方法來本地化solutions like this中使用的屬性(如「描述」)?

哪一個是首選解決方案 - 擴展方法或屬性。在我看來,這不是屬性的預期目的。事實上,現在我想到了,如果我使用擴展方法,那麼屬性看起來像是我用來在資源文件中爲我想用來代替枚舉值的本地化字符串指定一個鍵。

編輯 - 例如:

考慮下面的枚舉,

public enum TransactionTypes { 
    Cheque = 1, 
    BankTransfer = 2, 
    CreditCard = 3 
} 

我想一個方法來映射每種類型的本地化字符串。我開始使用一個擴展方法來使用一個switch語句和對資源文件的強類型引用。

但是,每個枚舉的擴展方法似乎不是一個很好的解決方案。我已開始遵循this爲每個枚舉值創建一個自定義屬性。該屬性具有包含本地化字符串的資源文件的基本名稱和密鑰。在上面的枚舉,例如,我有這樣的:

... 
[EnumResourceAttribute("FinancialTransaction", "Cheque")] 
Cheque = 1, 
... 

其中「FinanacialTransaction」是的resx文件,「檢查」是字符串鍵。我試圖創建一個實用程序方法,我可以從任何枚舉中傳遞任何值,並讓它返回該值的本地化字符串表示形式,假定指定了自定義屬性。我只是無法弄清楚如何動態訪問資源文件和其中的一個關鍵。

回答

2

我繼續與自定義屬性,並創造了這個實用方法:

public static string getEnumResourceString(Enum value) 
    { 
     System.Reflection.FieldInfo fi = value.GetType().GetField(value.ToString()); 
     EnumResourceAttribute attr = (EnumResourceAttribute)System.Attribute.GetCustomAttribute(fi, typeof(EnumResourceAttribute)); 
     return (string)HttpContext.GetGlobalResourceObject(attr.BaseName, attr.Key); 
    } 
8

我肯定會建議使用一個資源文件,可能用一個方法(擴展或其他方法)來簡單地獲取相關資源。隨着您支持的語言數量的增長,您並不是真的希望代碼充滿文本,從您自己的價值觀中分散注意力。

同樣的翻譯公司有可能被作好準備,以處理RESX文件 - 他們不會圍繞要亂在源代碼中,你不應該讓他們這樣做呢:)

剛使用鍵入enum名稱和其中的值的資源。直截了當,擴展到多個枚舉和多種語言,不會混淆你的源代碼,適用於翻譯工具,基本上可以與.NET中的i18n流程一起使用。

編輯:對於枚舉值映射到資源名稱,我只是這樣做:

public static string ToResourceName<T>(this T value) where T : struct 
{ 
    return typeof(T).Name + "." + value; 
} 

然後,你可以這樣做:

string resource = MyEnum.SomeValue.ToResourceName(); 

顯然,這在執行字符串連接每次 - 你可能緩存,如果你想,但我不會打擾,除非你有一些跡象表明,這實際上是一個問題。

當然,這並不會阻止您使用擴展方法進行非枚舉。如果你想這樣做,你需要像Unconstrained Melody這樣的東西。

+0

+1我1分鐘太晚了:) – 2010-05-25 14:06:01

+0

我本來應該更清晰 - 我不打算使用比其他任何資源文件(我們已經將它們用於需要國際化域名的其他一切)。我正在尋找將資源字符串映射到枚舉的解決方案。 – Matt 2010-05-25 14:14:55

+0

@Duke:好的,這不是非常清楚你想要什麼 - 我已經用一個非常簡單的擴展方法更新了我的答案,但是我懷疑你是在追求更多的東西... – 2010-05-25 14:24:15