A common hindrance in creating enums is the desire to display text other than its’ name or integer value.
Take for instance this enum:
public enum Colors
{
Red,
Green,
Blue
}
Simple right? If the end user needs to see the names of the values, we can just display them as is; life is good.
Now the requirement comes in and says that we need to add a new color “Light Blue”.
public enum Colors
{
Red,
Green,
Blue,
LightBlue,
}
Oh no what to do? Maybe we can write a parser to insert spaces whenever there is a capital letter; what do we do if there are multiple capital letters in a row? And you just over herd the business discussing whether we should display “Electric Green” instead of “Green” for the Green value…
In any case, sooner or later you’ll run into a situation where you’ll need to get a description for your enums instead of their names. I’d like to present a fairly simple yet useful approach to giving these enums descriptions. *
First, we need to reference and import System.ComponentModel.
using System.ComponentModel;
Next, we decorate our enums with description attributes, setting their desired description where it varies from the enum name.
public enum Colors
{
Red,
[Description("Electric Green")]
Green,
Blue,
[Description("Light Blue")]
LightBlue,
}
Next, we implement some code to get the description attribute if one exists if not return the enum name.
public static class EnumExtensions
{
public static string GetDescription(this T enumerationValue)
where T : struct
{
var type = enumerationValue.GetType();
if(!type.IsEnum)
{
throw new ArgumentException($"{nameof(enumerationValue)} must be of Enum type", nameof(enumerationValue));
}
var memberInfo = type.GetMember(enumerationValue.ToString());
if(memberInfo.Length > 0)
{
var attrs = memberInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);
if(attrs.Length > 0)
{
return ((DescriptionAttribute)attrs[0]).Description;
}
}
return enumerationValue.ToString();
}
}
Finally, we consume our new method and display the descriptions.
Console.WriteLine(Colors.Green.GetDescription());
// Electric Green
I like this approach when simplicity is our goal. It’s nice to not have to hunt around the code for the function that converts them to the descriptions.
*: Where exactly you store your strings and whether they be localized or not is a topic for another post.