本文是看到大尾巴狼blog上的《利用自定义属性,定义枚举值的详细文本》之后撰写的,主要是描述了我个人所采用的显示枚举值描述信息的方法。——cncxz(虫虫) 2006-2-28
我们知道System.ComponentModel命名空间下有个名为DescriptionAttribute的类用于指定属性或事件的说明,我所调用的枚举值描述信息就是DescriptionAttribute类的Description属性值。
首先定义一个枚举
//////测试用的枚举
///
publicenumArticleTypeList
{
[DescriptionAttribute("中国软件开发网络")]
csdn,
msdn,
[DescriptionAttribute("博客园")]
cnblogs,
other
}
默认情况下我们采用ArticleTypeList.csdn.ToString()的方式只能得到“csdn”,而不是“中国软件开发网络”,为了获取“中国软件开发网络”,我定义了下面这样一个静态方法:
///
///获取枚举类子项描述信息
///
///
publicstaticstringGetEnumDescription(EnumenumSubitem)
{
stringstrValue=enumSubitem.ToString();
FieldInfofieldinfo=enumSubitem.GetType().GetField(strValue);
Object[]objs=fieldinfo.GetCustomAttributes(typeof(DescriptionAttribute),false);
if(objs==null||objs.Length==0)
{
returnstrValue;
}
else
{
DescriptionAttributeda=(DescriptionAttribute)objs[0];
returnda.Description;
}
}
直接通过GetEnumDescription(ArticleTypeList.csdn)便可获取到“中国软件开发网络”了,对于那些没有定义DescriptionAttribute的子项则直接返回枚举值,例如GetEnumDescription(ArticleTypeList.msdn)将返回“msdn”。
思路扩展
虽然使用DescriptionAttribute类基本上也满足了一般需求,可也不排除个别情况下需要多个描述值,针对这种情况,我们可以自System.Attribute类继承编写自定义属性类,例如:
///
///自定义的一个属性类
///
publicclassselfAttribute:Attribute
{
publicselfAttribute(stringdisplayText,stringdisplayTest)
{
m_DisplayText=displayText;
m_DisplayTest=displayTest;
}
privatestringm_DisplayText=string.Empty;
privatestringm_DisplayTest=string.Empty;
publicstringDisplayText
{
get{returnm_DisplayText;}
}
publicstringDisplayTest
{
get{returnm_DisplayTest;}
}
}
然后调整一下ArticleTypeList的代码:
//////测试用的枚举
///
publicenumArticleTypeList
{
[沈阳网站设计DescriptionAttribute("中国软件开发网络"),selfAttribute("自定义:中国软件开发网络","http://www.csdn.net")]
csdn,
[selfAttribute("自定义:MSDN2Library","http://msdn2.microsoft.com/zh-cn/library/default.aspx")]
msdn,
[DescriptionAttribute("博客园")]
cnblogs,
other
}
最后编写调用的静态方法:
///
///获取枚举类子项描述信息
///
///
publicstaticstringGetEnumDescription(EnumenumSubitem)
{
Objectobj=GetAttributeClass(enumSubitem,typeof(DescriptionAttribute));
if(obj==null)
{
returnenumSubitem.ToString();
}
else
{
DescriptionAttributeda=(DescriptionAttribute)obj;
returnda.Description;
}
}
publicstaticvoidGetselfAttributeInfo(EnumenumSubitem,outstringtext,outstringtest)
{
Objectobj=GetAttributeClass(enumSubitem,typeof(selfAttribute));
if(obj==null)
{
text=test=enumSubitem.ToString();
}
else
{
selfAttributeda=(selfAttribute)obj;
text=da.DisplayText;
test=da.DisplayTest;
}
}
///
///获取指定属性类的实例
///
///
///
privatestaticObjectGetAttributeClass(EnumenumSubitem,TypeattributeType)
{
FieldInfofieldinfo=enumSubitem.GetType().GetField(enumSubitem.ToString());
Object[]objs=fieldinfo.GetCustomAttributes(attributeType,false);
if(objs==null||objs.Length==0)
{
returnnull;
}
returnobjs[0];
}
这样一来,对于DescriptionAttribute类描述信息,调用方法不变,而selfAttribute相关值的调用如下所示:
stringtext,test;
GetselfAttributeInfo(ArticleTypeList.csdn,outtext,outtest);
相关源码和工程下载:http://files.cnblogs.com/cncxz/EnumDes沈阳做网站cription.rar