将文化特定的枚举DisplayName字符串转换为枚举

时间:2016-08-05 14:01:20

标签: c# asp.net-mvc

我创建了一个小应用程序,我现在正在为每个页面上的常量定义特定于文化的文本。我一直在使用一些Enum DropDownLists,并且已经为每个Enum值使用Display(Name="Something")属性来显示字符串名称。

现在我正在使用资源文件来确定基于文化的文本,我必须将属性值更改为[Display(Name="SomeResourceValue", ResourceType=typeof(Resources.Resources))]

我遇到的问题是我有一个静态方法,它接受字符串DisplayName并返回Enum值(提供Enum类型),由于引入资源文件现在不起作用

我正在努力改进的方法如下:

//Converts Enum DisplayName attribute text to it's Enum value 
    public static T GetEnumDisplayNameValue<T>(this string name)
    {
        var type = typeof(T);
        if (!type.IsEnum)
            throw new ArgumentException();
        FieldInfo[] fields = type.GetFields();
        var field = fields
                        .SelectMany(f => f.GetCustomAttributes(
                            typeof(DisplayAttribute), false), (
                                f, a) => new { Field = f, Att = a }).SingleOrDefault(a => ((DisplayAttribute)a.Att)
                            .Name == name);

        return field == null ? default(T) : (T)field.Field.GetRawConstantValue();
    }

如果有人可以帮我改进,以便进行资源查找,我将非常感激。

1 个答案:

答案 0 :(得分:0)

  

工作解决方案如下:

    public static T GetEnumDisplayNameValue<T>(this string name, CultureInfo culture)
    {
        var type = typeof(T);
        if (!type.IsEnum)
            throw new ArgumentException();
        FieldInfo[] fields = type.GetFields();

        var field = fields.SelectMany(f => f.GetCustomAttributes(typeof(DisplayAttribute), false),
            (f, a) => new { Field = f, Att = a })
            .SingleOrDefault(a => Resources.ResourceManager.GetString(((DisplayAttribute)a.Att).Name, culture) == name);

        return field == null ? default(T) : (T)field.Field.GetRawConstantValue();
    }