Visual Studio .NET 2002Visual Studio .NET 2003Visual Studio 2005.NET 2.0中级开发Visual StudioWindows.NETASP.NETC#
为枚举添加描述
描述如何使用枚举上的 [Description] 属性
引言
你是否曾经希望为你的 enum 添加更具描述性的属性? 这里有一种方法。 让我们以一个非常简单的基于颜色的枚举 MyColors 为例。
using System;
using System.ComponentModel;
using System.Reflection;
public enum MyColors{
   White,
   Red,
   Green
}
如你所知,枚举由数字表示(请参阅此处的文档)。
如果你想关联文本,我们可以通过使用 System.ComponentModel.DescriptionAttribute 来实现。
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
}
但是仅仅将此属性与我们的 enum 关联并没有帮助。 我们还需要一种访问该信息的方式。 通过使用反射,我们可以访问枚举的所有属性。 下面的代码描述了一个简单的访问器,它将检索每个枚举的描述。
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;
}
就这样了。 现在我们可以调用...
GetDescription(MyColor.Green)
...我们将从描述中获取文本。 就这么简单。
为了好玩,让我们编写一个方法来根据该 string 获取我们的 enum 。 注意:这可能对大多数人有用,但想象一下,我们定义了一个名为 [AssociatedUriAttribute] 的新属性,我们希望将一个唯一的 URI 与我们的 enum 关联。 这将打开很多可能性。 注意:这次我们将将其嵌入到基于泛型的类中。
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);
}
最终,我们得到一个非常简单的类,如下所示
using System;
using System.ComponentModel;
using System.Reflection;
/// <summary>
/// enum utilities. 
/// - converts from a [Description("")] to an enum value
/// - grabs the [Description("")] 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);
    }
}
历史
- 2006年4月17日:初始发布



