2015-10-19 107 views
9

我是C#的新手,我在枚举中遇到了一些麻烦。来自显示名称的枚举值

我已枚举定义是这样的:

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

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

我需要的是代码,将检查并显示名称存在,如果这样返回枚举值。

所以,如果我的显示名称:

var name = "first_name"; 

我需要这样的东西:

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

这应返回:

CustomFields.FirstName; 

回答

14

你可以使用泛型:

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

尝试以下。

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, 
}