Enum to list as an extension?

后端 未结 6 1300
花落未央
花落未央 2021-02-19 19:00

I have various enums that I use as sources for dropdown lists, In order to provide for a user-friendly description, I added a Description attribute to each enum, an

6条回答
  •  清酒与你
    2021-02-19 19:45

    Whenever I need an enumeration (a static list of known values) that need to have something more than just a mere integer value and a string counterpart, I end up using this Enumeration Utility class that essentially gives me java-like enumeration behavior.

    So that would be my first option if I were on op's shoes as it would make it really trivial to achieve what he/she wants.

    But, assuming this is not an option for op and she/he need to stick with C# enums, I would use a combination of both ehsan-sajjad and frank-j solutions:

    1. Have an extension method to return the description of a given enum item, which is pretty much what op had already;
    2. Have a static helper method to return a dictionary of items and their respective descriptions for a given enum type.

    Here is how I would implement this:

    public static class EnumUtils
    {
        public static string GetDescription(this Enum enumVal)
        {
            var type = enumVal.GetType();
            var memInfo = type.GetMember(enumVal.ToString());
            var attributes = memInfo[0].GetCustomAttributes(typeof (DescriptionAttribute), false);
    
            return (attributes.Length > 0) ? ((DescriptionAttribute) attributes[0]).Description : null;
        }
    
        public static Dictionary GetItemsWithDescrition()
        {
            var enumType = typeof(TEnum);
            if (!enumType.IsEnum)
            {
                throw new InvalidOperationException("TEnum must be an enum type");
            }
    
            return Enum
                    .GetValues(enumType)
                    .Cast()
                    .ToDictionary(enumValue => enumValue, enumValue => GetDescription(enumValue as Enum));
        }
    }
    

    And here is what the usage would look like:

    public class EnumUtilsTests
    {
        public enum MyEnum
        {
            [Description("Um")]
            One,
            [Description("Dois")]
            Two,
            [Description("Tres")]
            Three,
            NoDescription
        }
    
        public void Should_get_enum_description()
        {
            MyEnum.One.GetDescription().ShouldBe("Um");
            MyEnum.Two.GetDescription().ShouldBe("Dois");
            MyEnum.Three.GetDescription().ShouldBe("Tres");
            MyEnum.NoDescription.GetDescription().ShouldBe(null);
        }
    
        public void Should_get_all_enum_values_with_description()
        {
            var response = EnumUtils.GetItemsWithDescrition();
    
            response.ShouldContain(x => x.Key == MyEnum.One && x.Value == "Um");
            response.ShouldContain(x => x.Key == MyEnum.Two && x.Value == "Dois");
            response.ShouldContain(x => x.Key == MyEnum.Three && x.Value == "Tres");
            response.ShouldContain(x => x.Key == MyEnum.NoDescription && x.Value == null);
        }
    }
    

提交回复
热议问题