我们知道System.ComponentModel命名空间下有个名为DescriptionAttribute的类用于指定属性或事件的说明,我所调用的枚举值描述信息就是DescriptionAttribute类的Description属性值。
首先定义一个枚举

/**//// <summary>
/// 测试用的枚举
/// </summary>
public enum ArticleTypeList

{
[DescriptionAttribute("中国软件开发网络")]
csdn,
msdn,
[DescriptionAttribute("博客园")]
cnblogs,
other
}
默认情况下我们采用ArticleTypeList.csdn.ToString()的方式只能得到“csdn”,而不是“中国软件开发网络”,为了获取“中国软件开发网络”,我定义了下面这样一个静态方法:


/**//// <summary>
/// 获取枚举类子项描述信息
/// </summary>
/// <param name="enumSubitem">枚举类子项</param>
public static string GetEnumDescription(Enum enumSubitem)

{
string strValue = enumSubitem.ToString();

FieldInfo fieldinfo = enumSubitem.GetType().GetField(strValue);
Object[] objs = fieldinfo.GetCustomAttributes(typeof(DescriptionAttribute), false);
if (objs == null || objs.Length == 0)

{
return strValue;
}
else

{
DescriptionAttribute da = (DescriptionAttribute)objs[0];
return da.Description;
}

}
直接通过GetEnumDescription(ArticleTypeList.csdn)便可获取到“中国软件开发网络”了,对于那些没有定义DescriptionAttribute的子项则直接返回枚举值,例如GetEnumDescription(ArticleTypeList.msdn)将返回“msdn”。
思路扩展
虽然使用DescriptionAttribute类基本上也满足了一般需求,可也不排除个别情况下需要多个描述值,针对这种情况,我们可以自System.Attribute类继承编写自定义属性类,例如:


/**//// <summary>
/// 自定义的一个属性类
/// </summary>
public class selfAttribute : Attribute

{
public selfAttribute(string displayText, string displayTest)

{
m_DisplayText = displayText;
m_DisplayTest = displayTest;
}

private string m_DisplayText = string.Empty;
private string m_DisplayTest = string.Empty;
public string DisplayText

{

get
{ return m_DisplayText; }
}

public string DisplayTest

{

get
{ return m_DisplayTest; }
}
} 然后调整一下ArticleTypeList的代码:

/**//// <summary>
/// 测试用的枚举
/// </summary>
public enum ArticleTypeList

{
[DescriptionAttribute("中国软件开发网络"), selfAttribute("自定义:中国软件开发网络", "http://www.csdn.net")]
csdn,
[selfAttribute("自定义:MSDN2 Library", "http://msdn2.microsoft.com/zh-cn/library/default.aspx")]
msdn,
[DescriptionAttribute("博客园")]
cnblogs,
other
} 最后编写调用的静态方法:


/**//// <summary>
/// 获取枚举类子项描述信息
/// </summary>
/// <param name="enumSubitem">枚举类子项</param>
public static string GetEnumDescription(Enum enumSubitem)

{
Object obj = GetAttributeClass(enumSubitem, typeof(DescriptionAttribute));
if (obj == null)

{
return enumSubitem.ToString();
}
else

{
DescriptionAttribute da = (DescriptionAttribute)obj;
return da.Description;
}
}

public static void GetselfAttributeInfo(Enum enumSubitem,out string text,out string test)

{
Object obj = GetAttributeClass(enumSubitem, typeof(selfAttribute));
if (obj == null)

{
text=test= enumSubitem.ToString();
}
else

{
selfAttribute da = (selfAttribute)obj;
text= da.DisplayText;
test = da.DisplayTest;
}
}


/**//// <summary>
/// 获取指定属性类的实例
/// </summary>
/// <param name="enumSubitem">枚举类子项</param>
/// <param name="attributeType">DescriptionAttribute属性类或其自定义属性类 类型,例如:typeof(DescriptionAttribute)</param>
private static Object GetAttributeClass(Enum enumSubitem, Type attributeType)

{
FieldInfo fieldinfo = enumSubitem.GetType().GetField(enumSubitem.ToString());
Object[] objs = fieldinfo.GetCustomAttributes(attributeType, false);
if (objs == null || objs.Length == 0)

{
return null;
}
return objs[0];
}

这样一来,对于DescriptionAttribute类描述信息,调用方法不变,而selfAttribute相关值的调用如下所示:

string text, test;
GetselfAttributeInfo(ArticleTypeList.csdn, out text, out test);

相关源码和工程下载:https://files.cnblogs.com/cncxz/EnumDescription.rar