Get the Enum<T> value Description

bindinglist, c#, enums, generics

Solution

Take a look at this article. You can do this using the System.ComponentModel.DescriptionAttribute or creating your own attribute:

/// <summary>
/// Provides a description for an enumerated type.
/// </summary>
[AttributeUsage(AttributeTargets.Enum | AttributeTargets.Field, 
 AllowMultiple = false)]
public sealed class EnumDescriptionAttribute :  Attribute
{
   private string description;

   /// <summary>
   /// Gets the description stored in this attribute.
   /// </summary>
   /// <value>The description stored in the attribute.</value>
   public string Description
   {
      get
      {
         return this.description;
      }
   }

   /// <summary>
   /// Initializes a new instance of the
   /// <see cref="EnumDescriptionAttribute"/> class.
   /// </summary>
   /// <param name="description">The description to store in this attribute.
   /// </param>
   public EnumDescriptionAttribute(string description)
       : base()
   {
       this.description = description;
   }
} 

You then need to decorate the enum values with this new attribute:

public enum SimpleEnum
{
   [EnumDescription("Today")]
   Today,

   [EnumDescription("Last 7 days")]
   Last7,

   [EnumDescription("Last 14 days")]
   Last14,

   [EnumDescription("Last 30 days")]
   Last30,

   [EnumDescription("All")]
   All
} 

All of the "magic" takes place in the following extension methods:

/// <summary>
/// Provides a static utility object of methods and properties to interact
/// with enumerated types.
/// </summary>
public static class EnumHelper
{
   /// <summary>
   /// Gets the <see cref="DescriptionAttribute" /> of an <see cref="Enum" /> 
   /// type value.
   /// </summary>
   /// <param name="value">The <see cref="Enum" /> type value.</param>
   /// <returns>A string containing the text of the
   /// <see cref="DescriptionAttribute"/>.</returns>
   public static string GetDescription(this Enum value)
   {
      if (value == null)
      {
         throw new ArgumentNullException("value");
      }

      string description = value.ToString();
      FieldInfo fieldInfo = value.GetType().GetField(description);
      EnumDescriptionAttribute[] attributes =
         (EnumDescriptionAttribute[])
       fieldInfo.GetCustomAttributes(typeof(EnumDescriptionAttribute), false);

      if (attributes != null && attributes.Length > 0)
      {
         description = attributes[0].Description;
      }
      return description;
   }

   /// <summary>
   /// Converts the <see cref="Enum" /> type to an <see cref="IList" /> 
   /// compatible object.
   /// </summary>
   /// <param name="type">The <see cref="Enum"/> type.</param>
   /// <returns>An <see cref="IList"/> containing the enumerated
   /// type value and description.</returns>
   public static IList ToList(this Type type)
   {
      if (type == null)
      {
         throw new ArgumentNullException("type");
      }

      ArrayList list = new ArrayList();
      Array enumValues = Enum.GetValues(type);

      foreach (Enum value in enumValues)
      {
         list.Add(new KeyValuePair<Enum, string>(value, GetDescription(value)));
      }

      return list;
   }
} 

Finally, you can then simply bind the combobox:

combo.DataSource = typeof(SimpleEnum).ToList();

Problem

I have my enumHelper class that contains these: ``` public static IList<T> GetValues() { IList<T> list = new List<T>(); foreach (object value in Enum.GetValues(typeof(T))) { list.Add((T)value); } return list; } ``` and ``` public static string Description(Enum value) { Attribute DescAttribute = LMIGHelper.GetAttribute(value, typeof(DescriptionAttribute)); if (DescAttribute == null) return value.ToString(); else return ((DescriptionAttribute)DescAttribute).Description; } ``` my enum is something like: ``` public enum OutputType { File, [Description("Data Table")] DataTable } ``` So far so good. All the previous work fine. Now I want to add a new helper to return BindingList>, so I can link any enum to any combo using ``` BindingList<KeyValuePair<OutputType, string>> list = Enum<OutputType>.GetBindableList(); cbo.datasource=list; cbo.DisplayMember="Value"; cbo.ValueMember="Key"; ``` For that I added: ``` public static BindingList<KeyValuePair<T, string>> GetBindingList() { BindingList<KeyValuePair<T, string>> list = new BindingList<KeyValuePair<T, string>>(); foreach (T value in Enum<T>.GetValues()) { string Desc = Enum<T>.Description(value); list.Add(new KeyValuePair<T, string>(value, Desc)); } return list; } ``` But "Enum.Description(value)" is not even compiling: Argument '1': cannot convert from 'T' to 'System.Enum' How can I do that? Is that even possible? Thank you.

Original source

Related problems