2010-05-25 79 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