【问题标题】:Enum value from display name来自显示名称的枚举值
【发布时间】:2016-01-18 11:13:46
【问题描述】:

我是 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;

【问题讨论】:

    标签: c# enums


    【解决方案1】:

    你可以使用泛型:

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

    【讨论】:

      【解决方案2】:

      试试下面的。

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

      【讨论】:

        猜你喜欢
        • 2010-09-23
        • 1970-01-01
        • 1970-01-01
        • 2016-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-02
        • 2019-07-04
        相关资源
        最近更新 更多