Monday 28 January 2019

How to get Enum Description, DisplayName and Dictionary?

I was using it frequently but missed to post it. Let's see how to create a simple Enum extension method and how to transform Enums in to list/dictionary with its DisplayName or Description attribute.

Helper:
using System;
using System.ComponentModel;
using System.Reflection;
 
namespace EnumHelper
{
    public static class EnumExtensions
    {
        public static string ToDescription(this Enum value)
        {
            FieldInfo field;
            DescriptionAttribute attribute;
            string result;
 
            field = value.GetType().GetField(value.ToString());
            attribute = (DescriptionAttribute)Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute));
            result = attribute != null ? attribute.Description : string.Empty;
 
            return result;
        }
 
        public static bool HasDescription(this Enum someEnum)
        {
            return !string.IsNullOrEmpty(someEnum.ToDescription());
        }
 
        public static string ToDisplayName(this Enum value)
        {
            FieldInfo field;
            DisplayNameAttribute attribute;
            string result;
 
            field = value.GetType().GetField(value.ToString());
            attribute = (DisplayNameAttribute)Attribute.GetCustomAttribute(field, typeof(DisplayNameAttribute));
            result = attribute != null ? attribute.DisplayName : string.Empty;
 
            return result;
        }
 
        public static bool HasDisplayName(this Enum someEnum)
        {
            return !string.IsNullOrEmpty(someEnum.ToDisplayName());
        }
 
        public static int ToValue(this Enum someEnum)
        {
            return Convert.ToInt32(someEnum);
        }
 
    }
}

Implementation:
using System;
using System.ComponentModel;
using System.Linq;
 
namespace EnumHelper
{
 
    enum PrimaryColors
    {
        [Description("R for Red")]
        [DisplayName("R")]
        Red  = 1,
 
        [Description("G for Green")]
        [DisplayName("G")]
        Green = 1,
 
 
        [Description("B for Blue")]
        [DisplayName("B")]
        Blue = 4    
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            var hasDescription = PrimaryColors.Red.HasDescription();
            var dataDescription = PrimaryColors.Red.ToDescription();
            Console.WriteLine($"hasDescription: {hasDescription}");
            Console.WriteLine($"dataDescription: {dataDescription}");
 
 
            var dataText = PrimaryColors.Red.ToString();
            Console.WriteLine($"dataText: {dataText}");
 
            var dataValue = PrimaryColors.Red.ToValue();
            Console.WriteLine($"dataValue: {dataValue}");
 
 
            var hasDIsplayName = PrimaryColors.Red.HasDisplayName();
            var dataDiaplayName = PrimaryColors.Red.ToDisplayName();
            Console.WriteLine($"hasDIsplayName: {hasDIsplayName}");
            Console.WriteLine($"dataDiaplayName: {dataDiaplayName}");
 
 
            var listText = Enum.GetValues(typeof(PrimaryColors)).Cast<PrimaryColors>().Select( d => d.ToString()).ToList();
            var listValues = Enum.GetValues(typeof(PrimaryColors)).Cast<int>().ToList();
            var dictionary_with_value_and_description = Enum.GetValues(typeof(PrimaryColors))
                            .Cast<PrimaryColors>()
                            .ToDictionary( data => data.ToValue(), data => data.ToDescription());
 
            var dictionary_with_value_and_display_name = Enum.GetValues(typeof(PrimaryColors))
                            .Cast<PrimaryColors>()
                            .ToDictionary(data => data.ToValue(), data => data.ToDisplayName());
 
 
 
            //Note: We can assign duplicate value like Red = 1, Green = 1. But having duplicate may lead error/affect resultset if we filter/parse.
 
            Console.Read();
        }
    }
}