2016-08-05 15 views
3

私は小さなアプリケーションを作成しました。これは、各ページの定数のカルチャ固有のテキストを定義するプロセスです。いくつかのEnum DropDownListsを使用していて、表示する文字列名の各Enum値にDisplay(Name="Something")属性を使用しています。カルチャ固有のEnum DisplayName文字列を列挙型に変換する

今、私は私がいる問題は私が取る静的メソッドを持っていたということです[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(); 
    } 
関連する問題