2016-08-05 11 views
3

Ich habe eine kleine Anwendung erstellt, die ich bin jetzt im Prozess der Kultur spezifischen Text für die Konstanten auf jeder der Seiten definieren. Ich habe ein paar Enum DropDownLists verwendet und habe das Display(Name="Something") Attribut für jeden der Enum-Werte für den String-Namen verwendet, um anzuzeigen.Converting Culture Specific Enum Displayname String in Enum

Nun, da ich Ressourcendateien bin mit dem Text zu bestimmen, auf der Grundlage der Kultur habe ich habe, ist die Attributwerte zu [Display(Name="SomeResourceValue", ResourceType=typeof(Resources.Resources))]

Das Problem, das ich habe zu ändern, dass ich eine statische Methode hatte, dass die Takes Zeichenfolge DisplayName und gibt den Enum-Wert zurück (vorausgesetzt, der Enum-Typ wird angegeben), der jetzt seit der Einführung der Ressourcendateien nicht mehr funktioniert.

Die Methode Ich versuche, auf zu verbessern, ist wie folgt:

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

Wenn jemand könnte mir dies verbessern für eine Ressourcensuche ermöglichen ich sehr dankbar wäre.

Antwort

0

Die Arbeitslösung ist wie folgt:

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