2015-10-19 28 views
9

Sono nuovo con C# e ho alcuni problemi con enum.Valore enum dal nome visualizzato

ho Enum definita in questo modo:

public enum CustomFields 
{ 
    [Display(Name = "first_name")] 
    FirstName = 1, 

    [Display(Name = "last_name")] 
    LastName = 2, 
} 

cosa ho bisogno è il codice che controllerà non il nome visualizzato esiste e se è così restituire valore enum.

Quindi, se ho nome visualizzato:

var name = "first_name"; 

Ho bisogno di qualcosa di simile:

var name = "first_name"; 
CustomFields.getEnumValue(name); 

Ciò dovrebbe restituire:

CustomFields.FirstName; 

risposta

14

Si potrebbe utilizzare farmaci generici:

public class Program 
    { 
     private static void Main(string[] args) 
     { 
      var name = "first_name"; 
      CustomFields customFields = EnumHelper<CustomFields>.GetValueFromName(name); 
     } 
    } 

    public enum CustomFields 
    { 
     [Display(Name = "first_name")] 
     FirstName = 1, 

     [Display(Name = "last_name")] 
     LastName = 2, 
    } 

    public static class EnumHelper<T> 
    { 
     public static T GetValueFromName(string name) 
     { 
      var type = typeof (T); 
      if (!type.IsEnum) throw new InvalidOperationException(); 

      foreach (var field in type.GetFields()) 
      { 
       var attribute = Attribute.GetCustomAttribute(field, 
        typeof (DisplayAttribute)) as DisplayAttribute; 
       if (attribute != null) 
       { 
        if (attribute.Name == name) 
        { 
         return (T) field.GetValue(null); 
        } 
       } 
       else 
       { 
        if (field.Name == name) 
         return (T) field.GetValue(null); 
       } 
      } 

      throw new ArgumentOutOfRangeException("name"); 
     } 
    } 
0

provare quanto segue.

void Main() 
{ 
    CustomFields value1 = GetEnumValue("first_name"); 
    CustomFields value2 = GetEnumValue("last_name"); 
} 

static Dictionary<string, CustomFields> displayNameMapping; 

static CustomFields GetEnumValue(String displayName){ 
    if (displayNameMapping == null){ 
     var enumType = typeof(CustomFields); 
     var displayAttributeType = typeof(DisplayAttribute); 
     CustomFields? found = null; 

     displayNameMapping = new Dictionary<string, CustomFields>(); 
     Enum.GetNames(enumType).ToList().ForEach(name=>{ 
      var member = enumType.GetMember(name).First(); 
      var displayAttrib = (DisplayAttribute)member.GetCustomAttributes(displayAttributeType, false).First(); 
      displayNameMapping.Add(displayAttrib.Name, (CustomFields)Enum.Parse(enumType, name)); 
     }); 
    } 

    return displayNameMapping[displayName]; 
} 

// Define other methods and classes here 
public enum CustomFields 
{ 
    [Display(Name = "first_name")] 
    FirstName = 1, 

    [Display(Name = "last_name")] 
    LastName = 2, 
}