Getting attributes of Enum's value

后端 未结 25 2573
慢半拍i
慢半拍i 2020-11-22 00:35

I would like to know if it is possible to get attributes of the enum values and not of the enum itself? For example, suppose I have the following <

相关标签:
25条回答
  • 2020-11-22 01:03

    This should do what you need.

    var enumType = typeof(FunkyAttributesEnum);
    var memberInfos = enumType.GetMember(FunkyAttributesEnum.NameWithoutSpaces1.ToString());
    var enumValueMemberInfo = memberInfos.FirstOrDefault(m => m.DeclaringType == enumType);
    var valueAttributes = 
          enumValueMemberInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);
    var description = ((DescriptionAttribute)valueAttributes[0]).Description;
    
    0 讨论(0)
  • 2020-11-22 01:04

    You can also define an enum value like Name_Without_Spaces, and when you want a description use Name_Without_Spaces.ToString().Replace('_', ' ') to replace the underscores with spaces.

    0 讨论(0)
  • 2020-11-22 01:06

    If your enum contains a value like Equals you might bump into a few bugs using some extensions in a lot of answers here. This is because it is normally assumed that typeof(YourEnum).GetMember(YourEnum.Value) would return only one value, which is the MemberInfo of your enum. Here's a slightly safer version Adam Crawford's answer.

    public static class AttributeExtensions
    {
        #region Methods
    
        public static T GetAttribute<T>(this Enum enumValue) where T : Attribute
        {
            var type = enumValue.GetType();
            var memberInfo = type.GetMember(enumValue.ToString());
            var member = memberInfo.FirstOrDefault(m => m.DeclaringType == type);
            var attribute = Attribute.GetCustomAttribute(member, typeof(T), false);
            return attribute is T ? (T)attribute : null;
        }
    
        #endregion
    }
    
    0 讨论(0)
  • 2020-11-22 01:07

    And if you want the full list of names you can do something like

    typeof (PharmacyConfigurationKeys).GetFields()
            .Where(x => x.GetCustomAttributes(false).Any(y => typeof(DescriptionAttribute) == y.GetType()))
            .Select(x => ((DescriptionAttribute)x.GetCustomAttributes(false)[0]).Description);
    
    0 讨论(0)
  • 2020-11-22 01:08

    Get the dictionary from enum.

    public static IDictionary<string, int> ToDictionary(this Type enumType)
    {
        return Enum.GetValues(enumType)
        .Cast<object>()
        .ToDictionary(v => ((Enum)v).ToEnumDescription(), k => (int)k); 
    }
    

    Now call this like...

    var dic = typeof(ActivityType).ToDictionary();
    

    EnumDecription Ext Method

    public static string ToEnumDescription(this Enum en) //ext method
    {
        Type type = en.GetType();
        MemberInfo[] memInfo = type.GetMember(en.ToString());
        if (memInfo != null && memInfo.Length > 0)
        {
            object[] attrs = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);
            if (attrs != null && attrs.Length > 0)
                return ((DescriptionAttribute)attrs[0]).Description;
        }
        return en.ToString();
    }
    
    public enum ActivityType
    {
        [Description("Drip Plan Email")]
        DripPlanEmail = 1,
        [Description("Modification")]
        Modification = 2,
        [Description("View")]
        View = 3,
        [Description("E-Alert Sent")]
        EAlertSent = 4,
        [Description("E-Alert View")]
        EAlertView = 5
    }
    
    0 讨论(0)
  • 2020-11-22 01:08

    I this answer to setup a combo box from an enum attributes which was great.

    I then needed to code the reverse so that I can get the selection from the box and return the enum in the correct type.

    I also modified the code to handle the case where an attribute was missing

    For the benefits of the next person, here is my final solution

    public static class Program
    {
       static void Main(string[] args)
        {
           // display the description attribute from the enum
           foreach (Colour type in (Colour[])Enum.GetValues(typeof(Colour)))
           {
                Console.WriteLine(EnumExtensions.ToName(type));
           }
    
           // Get the array from the description
           string xStr = "Yellow";
           Colour thisColour = EnumExtensions.FromName<Colour>(xStr);
    
           Console.ReadLine();
        }
    
       public enum Colour
       {
           [Description("Colour Red")]
           Red = 0,
    
           [Description("Colour Green")]
           Green = 1,
    
           [Description("Colour Blue")]
           Blue = 2,
    
           Yellow = 3
       }
    }
    
    public static class EnumExtensions
    {
    
        // This extension method is broken out so you can use a similar pattern with 
        // other MetaData elements in the future. This is your base method for each.
        public static T GetAttribute<T>(this Enum value) where T : Attribute
        {
            var type = value.GetType();
            var memberInfo = type.GetMember(value.ToString());
            var attributes = memberInfo[0].GetCustomAttributes(typeof(T), false);
    
            // check if no attributes have been specified.
            if (((Array)attributes).Length > 0)
            {
                return (T)attributes[0];
            }
            else
            {
                return null;
            }
        }
    
        // This method creates a specific call to the above method, requesting the
        // Description MetaData attribute.
        public static string ToName(this Enum value)
        {
            var attribute = value.GetAttribute<DescriptionAttribute>();
            return attribute == null ? value.ToString() : attribute.Description;
        }
    
        /// <summary>
        /// Find the enum from the description attribute.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="desc"></param>
        /// <returns></returns>
        public static T FromName<T>(this string desc) where T : struct
        {
            string attr;
            Boolean found = false;
            T result = (T)Enum.GetValues(typeof(T)).GetValue(0);
    
            foreach (object enumVal in Enum.GetValues(typeof(T)))
            {
                attr = ((Enum)enumVal).ToName();
    
                if (attr == desc)
                {
                    result = (T)enumVal;
                    found = true;
                    break;
                }
            }
    
            if (!found)
            {
                throw new Exception();
            }
    
            return result;
        }
    }
    

    }

    0 讨论(0)
提交回复
热议问题