Getting attributes of Enum's value

后端 未结 25 2529
慢半拍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:18

    Bryan Rowe and AdamCrawford thanks for your answers!

    But if somebody need method for get Discription (not extension) you can use it:

    string GetEnumDiscription(Enum EnumValue)
            {
                var type = EnumValue.GetType();
                var memInfo = type.GetMember(EnumValue.ToString());
                var attributes = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);
                return (attributes.Length > 0) ? ((DescriptionAttribute)attributes[0]).Description : null;
            }
    
    0 讨论(0)
  • 2020-11-22 01:19

    This extension method will obtain a string representation of an enum value using its XmlEnumAttribute. If no XmlEnumAttribute is present, it falls back to enum.ToString().

    public static string ToStringUsingXmlEnumAttribute<T>(this T enumValue)
        where T: struct, IConvertible
    {
        if (!typeof(T).IsEnum)
        {
            throw new ArgumentException("T must be an enumerated type");
        }
    
        string name;
    
        var type = typeof(T);
    
        var memInfo = type.GetMember(enumValue.ToString());
    
        if (memInfo.Length == 1)
        {
            var attributes = memInfo[0].GetCustomAttributes(typeof(System.Xml.Serialization.XmlEnumAttribute), false);
    
            if (attributes.Length == 1)
            {
                name = ((System.Xml.Serialization.XmlEnumAttribute)attributes[0]).Name;
            }
            else
            {
                name = enumValue.ToString();
            }
        }
        else
        {
            name = enumValue.ToString();
        }
    
        return name;
    }
    
    0 讨论(0)
  • 2020-11-22 01:19

    This is how I solved it without using custom helpers or extensions with .NET core 3.1.

    Class

    public enum YourEnum
    {
        [Display(Name = "Suryoye means Arameans")]
        SURYOYE = 0,
        [Display(Name = "Oromoye means Syriacs")]
        OROMOYE = 1,
    }
    

    Razor

    @using Enumerations
    
    foreach (var name in Html.GetEnumSelectList(typeof(YourEnum)))
    {
        <h1>@name.Text</h1>
    }
    
    0 讨论(0)
  • 2020-11-22 01:20

    Taking advantage of some of the newer C# language features, you can reduce the line count:

    public static TAttribute GetEnumAttribute<TAttribute>(this Enum enumVal) where TAttribute : Attribute
    {
        var memberInfo = enumVal.GetType().GetMember(enumVal.ToString());
        return memberInfo[0].GetCustomAttributes(typeof(TAttribute), false).OfType<TAttribute>().FirstOrDefault();
    }
    
    public static string GetEnumDescription(this Enum enumValue) => enumValue.GetEnumAttribute<DescriptionAttribute>()?.Description ?? enumValue.ToString();
    
    0 讨论(0)
  • 2020-11-22 01:21

    In addition to AdamCrawford response, I've further created a more specialized extension methods that feed of it to get the description.

    public static string GetAttributeDescription(this Enum enumValue)
    {
        var attribute = enumValue.GetAttributeOfType<DescriptionAttribute>();
        return attribute == null ? String.Empty : attribute.Description;
    } 
    

    hence, to get the description, you could either use the original extension method as

    string desc = myEnumVariable.GetAttributeOfType<DescriptionAttribute>().Description
    

    or you could simply call the the extension method here as:

    string desc = myEnumVariable.GetAttributeDescription();
    

    Which should hopefully make your code a bit more readable.

    0 讨论(0)
  • 2020-11-22 01:22
        public enum DataFilters
        {
            [Display(Name= "Equals")]
            Equals = 1,// Display Name and Enum Name are same 
            [Display(Name= "Does Not Equal")]
            DoesNotEqual = 2, // Display Name and Enum Name are different             
        }
    

    Now it will produce error in this case 1 "Equals"

    public static string GetDisplayName(this Enum enumValue)
        {
            var enumMember = enumValue.GetType().GetMember(enumValue.ToString()).First();
            return enumMember.GetCustomAttribute<DisplayAttribute>() != null ? enumMember.GetCustomAttribute<DisplayAttribute>().Name : enumMember.Name;
        }
    

    so if it is same return enum name rather than display name because enumMember.GetCustomAttribute() gets null if displayname and enum name are same.....

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