2016-08-05 3 views
3

Я создал небольшое приложение, которое я сейчас нахожу в процессе определения специфического для культуры текста для констант на каждой из страниц. Я использовал несколько списков переходов Enum DropDownLists и использовал атрибут Display(Name="Something") для каждого из значений Enum для отображения имени строки.Преобразование типа культуры Enum DisplayName String to Enum

Теперь, когда я использую файлы ресурсов для определения текста, основанный на культуре я должен был изменить значения атрибутов [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(); 
    } 

Если кто-то может помочь мне улучшить это позволить для поиска ресурсов, я бы очень признателен.

ответ

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