2015-10-19 20 views
9

Tôi mới với C# và tôi có một số rắc rối với enum.Giá trị enum từ tên hiển thị

Tôi đã Enum định nghĩa như thế này:

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

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

Những gì tôi cần mã mà sẽ kiểm tra không tên hiển thị tồn tại và nếu như vậy trở về giá trị enum là.

Vì vậy, nếu tôi có tên hiển thị:

var name = "first_name"; 

tôi cần một cái gì đó như:

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

này sẽ trả về:

CustomFields.FirstName; 

Trả lời

14

Bạn có thể sử dụng Generics:

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

Hãy thử những điều sau đây.

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, 
} 
Các vấn đề liên quan