如何国际化表示C#枚举值的字符串?

如何国际化表示C#枚举值的字符串?,c#,enums,attributes,string,internationalization,C#,Enums,Attributes,String,Internationalization,我已经看到了许多关于将字符串映射到枚举以及将字符串映射到枚举的问题和答案,但是如何将一系列本地化字符串映射到枚举 我应该创建一个从资源文件返回正确字符串的函数吗?是否有一种方法可以本地化中使用的属性(如“描述”) 哪个是首选的解决方案-扩展方法或属性。在我看来,这并不是属性的预期目的。事实上,现在我想了想,如果我要使用扩展方法,一个属性看起来像是我要在资源文件中为我要用来代替枚举值的本地化字符串指定一个键的东西 编辑-示例: 给定以下枚举 public enum TransactionTypes

我已经看到了许多关于将字符串映射到枚举以及将字符串映射到枚举的问题和答案,但是如何将一系列本地化字符串映射到枚举

我应该创建一个从资源文件返回正确字符串的函数吗?是否有一种方法可以本地化中使用的属性(如“描述”)

哪个是首选的解决方案-扩展方法或属性。在我看来,这并不是属性的预期目的。事实上,现在我想了想,如果我要使用扩展方法,一个属性看起来像是我要在资源文件中为我要用来代替枚举值的本地化字符串指定一个键的东西

编辑-示例:

给定以下枚举

public enum TransactionTypes {
    Cheque = 1,
    BankTransfer = 2,
    CreditCard = 3
}
我想要一种将每种类型映射到本地化字符串的方法。我从enum的扩展方法开始,该扩展方法使用switch语句和对资源文件的强类型引用

然而,对每个枚举使用扩展方法似乎不是一个很好的解决方案。我已经开始为每个枚举值创建一个自定义属性。该属性具有包含本地化字符串的资源文件的基名称和键。例如,在上面的枚举中,我有:

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

其中,“FinanacialTransaction”是resx文件,“check”是字符串键。我试图创建一个实用程序方法,我可以将任何枚举中的任何值传递给它,并让它返回该值的本地化字符串表示形式,假设指定了自定义属性。我就是不知道如何动态访问资源文件和其中的密钥。

我肯定会建议使用资源文件,可能有一种方法(扩展名或其他)来简化获取相关资源的过程。随着您支持的语言数量的增加,您并不希望代码中充满文本,从而使您从值本身转移注意力

类似地,翻译公司可能会做好处理resx文件的准备——他们不会想在你的源代码中乱来,你也不应该让他们这么做:)

只需使用键入枚举名称及其值的资源。直截了当,可扩展到多个枚举和多种语言,不会弄乱源代码,与翻译工具配合良好,基本上与.NET中的i18n流保持一致

编辑:要将枚举值映射到资源名称,我只需执行以下操作:

public static string ToResourceName<T>(this T value) where T : struct
{
    return typeof(T).Name + "." + value;
}
很明显,每次都在执行字符串连接——如果愿意,可以缓存它,但除非您有迹象表明这确实是一个问题,否则我不会打扰您


当然,这并不妨碍您对非枚举使用扩展方法。如果要这样做,您需要类似的东西。

我继续使用自定义属性并创建了此实用程序方法:

    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);
    }

我应该更清楚一点——除了资源文件之外,我不打算使用其他任何东西(我们已经在使用它们来处理其他需要i18n的事情)。我正在寻找将资源字符串映射到枚举的解决方案。@Duke:好的,现在还不太清楚您想要什么-我已经用一个非常简单的扩展方法更新了我的答案,但我怀疑您想要的不仅仅是这些……我已经用示例做了一个大的编辑,以及我到目前为止的想法。
    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);
    }