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

Mat*_*att 5 c# string enums attributes internationalization

我已经看到很多关于将字符串映射到枚举的问题和答案,反之亦然,但是如何将一系列本地化字符串映射到枚举?

我应该只创建一个这样的扩展方法,从资源文件中返回正确的字符串吗?有没有办法本地化在这样的解决方案中使用的属性(如"描述")?

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

编辑 - 示例:

鉴于以下枚举,

public enum TransactionTypes {
    Cheque = 1,
    BankTransfer = 2,
    CreditCard = 3
}
Run Code Online (Sandbox Code Playgroud)

我想要一种方法将每种类型映射到本地化的字符串.我开始使用枚举的扩展方法,该方法使用switch语句和对资源文件的强类型引用.

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

...
[EnumResourceAttribute("FinancialTransaction", "Cheque")]
Cheque = 1,
...
Run Code Online (Sandbox Code Playgroud)

其中"FinanacialTransaction"是resx文件,"Check"是字符串键.我正在尝试创建一个实用程序方法,我可以从任何枚举中传递任何值,并让它返回该值的本地化字符串表示形式,假设指定了自定义属性.我无法弄清楚如何动态访问资源文件及其中的密钥.

Jon*_*eet 8

我肯定建议使用资源文件,可能使用方法(扩展名或其他方法),以便轻松获取相关资源.随着您支持的语言数量的增长,您并不希望代码充满文本,从而分散您对值本身的注意力.

同样,翻译公司很可能已经准备好处理resx文件了 - 他们不想在你的源代码中搞乱,你不应该让他们这样做:)

只需使用键入枚举名称及其中值的资源即可.简单,扩展到多个枚举和多种语言,不会使您的源代码混乱,适用于翻译工具,并且基本上与.NET中的i18n流程一致.

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

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

然后你可以这样做:

string resource = MyEnum.SomeValue.ToResourceName();
Run Code Online (Sandbox Code Playgroud)

显然每次都在执行字符串连接 - 如果你愿意,你可以缓存它,但除非你有迹象表明它实际上是一个问题,否则我不会打扰.

当然,这并不能阻止你使用非枚举的扩展方法.如果你想这样做,你需要像Unconstrained Melody这样的东西.


Mat*_*att 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);
    }
Run Code Online (Sandbox Code Playgroud)