Click here to Skip to main content
Licence CPOL
First Posted 17 Apr 2006
Views 26,984
Bookmarked 46 times

Adding Descriptions to your Enumerations

By | 17 Apr 2006 | Article
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;

/// <summary>
/// enum utilities. 
/// - converts from a [Description(&quot;&quot;)] to an enum value
/// - grabs the [Description(&quot;&quot;)] from an enum value
/// 
/// </summary>
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)

About the Author

skot

Web Developer

United States United States

Member



Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
GeneralA tweak PinmemberPIEBALDconsult14:59 3 Oct '07  
GeneralSeems we reinvented the wheel. Pinmemberwout de zeeuw0:32 13 May '07  
GeneralIn a utility class Pinmembermbowles2019:49 3 Nov '06  
Questionhow to make it display in Intellisense Pinmemberlinhjob9:51 26 May '06  
GeneralFinally! PinprotectorMarc Clifton1:29 18 Apr '06  
GeneralRe: Finally! Pinmemberskot6:44 18 Apr '06  
GeneralRe: Finally! PinmemberRichard Deeming7:07 28 Apr '06  

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.

Permalink | Advertise | Privacy | Mobile
Web02 | 2.5.120517.1 | Last Updated 17 Apr 2006
Article Copyright 2006 by skot
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid