Click here to Skip to main content
Click here to Skip to main content

Adding Descriptions to your Enumerations

, 17 Apr 2006
Rate this:
Please Sign up or sign in to vote.
Describes how to use a [Description] attribute on an enumeration

Introduction

Have you ever wanted to add a more descriptive attribute to your enums? Well, here is one way. Let's take a very simple color based enumeration called MyColors:

using System;
using System.ComponentModel;
using System.Reflection;

public enum MyColors{
   White,
   Red,
   Green
}

Now, as you know, enumerations are represented by numbers (see the docs here).

If you want to associate text, we can do so by using System.ComponentModel.DescriptionAttribute to do this.

using System;
using System.ComponentModel;
using System.Reflection;

public enum MyColors{
   [Description("The Color of my skin")]
   White,
   [Description("Bulls like this color")]
   Red,
   [Description("The color of slime")]
   Green
}

But just associating this attribute with our enum doesn't help. We need a way to access that information too. By using reflection, we can get access to all the attributes for the enumeration. The code below describes a simple accessor that will retrieve the descriptions from each enumeration.

public static string GetDescription(object enumValue, string defDesc){
        FieldInfo fi = enumValue.GetType().GetField(enumValue.ToString());
        
        if (null != fi)
        {
            object[] attrs = fi.GetCustomAttributes(typeof(DescriptionAttribute), true);
            if (attrs != null && attrs.Length > 0)
                return ((DescriptionAttribute)attrs[0]).Description;
        }

        return defDesc;
}

And that is it. Now we can call...

GetDescription(MyColor.Green)

... and we will get back the text from the description. It is just that simple.

Just for fun, let's write a method to get back our enum based on that string. Note: This might be useful for most, but imagine that we define a new attribute called [AssociatedUriAttribute] where we want to associate a URI with our enum that is unique. This opens things up quite a bit. Note: This time we will embed this in a generics based class.

public class EnumUtils<T>
{
    public static T FromDescription(string description){
        Type t = typeof(T);
        foreach (FieldInfo fi in t.GetFields())
        {
            object[] attrs = 
		fi.GetCustomAttributes(typeof(DescriptionAttribute), true);
            if (attrs != null && attrs.Length > 0)
            {
                foreach (DescriptionAttribute attr in attrs)
                {
                    if (attr.Description.Equals(description))
                        return (T)fi.GetValue(null);
                }
            }
        }
        return default(T);
}

In the end, we get a very simple class that looks like this:

using System;
using System.ComponentModel;
using System.Reflection;

/// <span class="code-SummaryComment"><summary></span>
/// enum utilities. 
/// - converts from a [Description(&quot;&quot;)] to an enum value
/// - grabs the [Description(&quot;&quot;)] from an enum value
/// 
/// <span class="code-SummaryComment"></summary></span>
public class EnumUtils<T>
{
    public static string GetDescription(T enumValue, string defDesc){
        
        FieldInfo fi = enumValue.GetType().GetField(enumValue.ToString());
        
        if (null != fi)
        {
            object[] attrs = fi.GetCustomAttributes
					(typeof(DescriptionAttribute), true);
            if (attrs != null && attrs.Length > 0)
                return ((DescriptionAttribute)attrs[0]).Description;
        }

        return defDesc;
    }
    
    public static string GetDescription(T enumValue)
    {
        return GetDescription(enumValue, string.Empty);
    }

    public static T FromDescription(string description){
        Type t = typeof(T);
        foreach (FieldInfo fi in t.GetFields())
        {
            object[] attrs = fi.GetCustomAttributes
					(typeof(DescriptionAttribute), true);
            if (attrs != null && attrs.Length > 0)
            {
                foreach (DescriptionAttribute attr in attrs)
                {
                    if (attr.Description.Equals(description))
                        return (T)fi.GetValue(null);
                }
            }
        }
        return default(T);
    }
}

History

  • 17th April, 2006: Initial post

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

skot
Web Developer
United States United States
No Biography provided

Comments and Discussions

 
GeneralMy vote of 5 PinmemberАslam Iqbal29-May-13 21:18 
GeneralA tweak PinmemberPIEBALDconsult3-Oct-07 14:59 
GeneralSeems we reinvented the wheel. Pinmemberwout de zeeuw13-May-07 0:32 
GeneralIn a utility class Pinmembermbowles2013-Nov-06 9:49 
Questionhow to make it display in Intellisense Pinmemberlinhjob26-May-06 9:51 
GeneralFinally! PinprotectorMarc Clifton18-Apr-06 1:29 
GeneralRe: Finally! Pinmemberskot18-Apr-06 6:44 
GeneralRe: Finally! PinmemberRichard Deeming28-Apr-06 7:07 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Mobile
Web01 | 2.8.140827.1 | Last Updated 17 Apr 2006
Article Copyright 2006 by skot
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid