您的位置:首页 > 其它

获取Enum枚举值描述的几法方法

2015-06-02 11:09 405 查看
原文:获取Enum枚举值描述的几法方法1.定义枚举时直接用中文

由于VS对中文支持的很不错,所以很多程序员都采用了此方案.

缺点:1.不适合多语言 2.感觉不太完美,毕竟大部分程序员大部分代码都使用英文

2.利用自定义属性定义枚举值的描述(博客园-大尾巴狼)

缺点:不适合多语言

原文:/article/5840756.html

枚举定义:

[EnumDescription("订单、订单中的产品、产品项的状态。")]

publicenumOrderStateEnum

{

[EnumDescription("未开始")]

Ready=0,


[EnumDescription("进行中")]

Processing,


[EnumDescription("等待中")]

Waiting,


[EnumDescription("取消")]

Canceled,


[EnumDescription("完成")]

Finished

}


代码访问:

0、获得枚举类型的文字描述

stringtxt=EnumDescription.GetEnumText(typeof(OrderStateEnum));


1、获得某个枚举值的文字描述:

stringtxt=EnumDescription.GetFieldText(OrderStateEnum.Processing)


2、获得枚举中各个字段的定义数组:

EnumDescription[]des=EnumDescription.GetFieldTexts(typeof(OrderStateEnum))


如果需要排序,通过他的另一个重载

publicstaticEnumDescription[]GetFieldTexts(TypeenumType,SortTypesortType)


3、绑定到下拉框:

comboBox1.DataSource=EnumDescription.GetFieldTexts(typeof(OrderStateEnum));

comboBox1.ValueMember="EnumValue";

comboBox1.DisplayMember="EnumDisplayText";

comboBox1.SelectedValue=(int)OrderStateEnum.Finished;//选中值



EnumDisplayText.cs源码

usingSystem;

usingSystem.Reflection;

usingSystem.Collections;

usingSystem.Text;


namespaceBirdSof

{

///<summary>

///把枚举值按照指定的文本显示

///<remarks>

///一般通过枚举值的ToString()可以得到变量的文本,

///但是有时候需要的到与之对应的更充分的文本,

///这个类帮助达到此目的

///Date:2006-3-25

///Author:dearzp@hotmail.com

///</remarks>

///</summary>

///<example>

///[EnumDescription("中文数字")]

///enumMyEnum

///{

///[EnumDescription("数字一")]

///One=1,

///

///[EnumDescription("数字二")]

///Two,

///

///[EnumDescription("数字三")]

///Three

///}

///EnumDescription.GetEnumText(typeof(MyEnum));

///EnumDescription.GetFieldText(MyEnum.Two);

///EnumDescription.GetFieldTexts(typeof(MyEnum));

///</example>

[AttributeUsage(AttributeTargets.Field|AttributeTargets.Enum)]

publicclassEnumDescription:Attribute

{

privatestringenumDisplayText;

privateintenumRank;

privateFieldInfofieldIno;


///<summary>

///描述枚举值

///</summary>

///<paramname="enumDisplayText">描述内容</param>

///<paramname="enumRank">排列顺序</param>

publicEnumDescription(stringenumDisplayText,intenumRank)

{

this.enumDisplayText=enumDisplayText;

this.enumRank=enumRank;

}


///<summary>

///描述枚举值,默认排序为5

///</summary>

///<paramname="enumDisplayText">描述内容</param>

publicEnumDescription(stringenumDisplayText)

:this(enumDisplayText,5){}


publicstringEnumDisplayText

{

get{returnthis.enumDisplayText;}

}


publicintEnumRank

{

get{returnenumRank;}

}


publicintEnumValue

{

get{return(int)fieldIno.GetValue(null);}

}


publicstringFieldName

{

get{returnfieldIno.Name;}

}


#region=========================================对枚举描述属性的解释相关函数


///<summary>

///排序类型

///</summary>

publicenumSortType

{

///<summary>

///按枚举顺序默认排序

///</summary>

Default,

///<summary>

///按描述值排序

///</summary>

DisplayText,

///<summary>

///按排序熵

///</summary>

Rank

}


privatestaticSystem.Collections.HashtablecachedEnum=newHashtable();



///<summary>

///得到对枚举的描述文本

///</summary>

///<paramname="enumType">枚举类型</param>

///<returns></returns>

publicstaticstringGetEnumText(TypeenumType)

{

EnumDescription[]eds=(EnumDescription[])enumType.GetCustomAttributes(typeof(EnumDescription),false);

if(eds.Length!=1)returnstring.Empty;

returneds[0].EnumDisplayText;

}


///<summary>

///获得指定枚举类型中,指定值的描述文本。

///</summary>

///<paramname="enumValue">枚举值,不要作任何类型转换</param>

///<returns>描述字符串</returns>

publicstaticstringGetFieldText(objectenumValue)

{

EnumDescription[]descriptions=GetFieldTexts(enumValue.GetType(),SortType.Default);

foreach(EnumDescriptionedindescriptions)

{

if(ed.fieldIno.Name==enumValue.ToString())returned.EnumDisplayText;

}

returnstring.Empty;

}



///<summary>

///得到枚举类型定义的所有文本,按定义的顺序返回

///</summary>

///<exceptioncref="NotSupportedException"></exception>

///<paramname="enumType">枚举类型</param>

///<returns>所有定义的文本</returns>

publicstaticEnumDescription[]GetFieldTexts(TypeenumType)

{

returnGetFieldTexts(enumType,SortType.Default);

}


///<summary>

///得到枚举类型定义的所有文本

///</summary>

///<exceptioncref="NotSupportedException"></exception>

///<paramname="enumType">枚举类型</param>

///<paramname="sortType">指定排序类型</param>

///<returns>所有定义的文本</returns>

publicstaticEnumDescription[]GetFieldTexts(TypeenumType,SortTypesortType)

{

EnumDescription[]descriptions=null;

//缓存中没有找到,通过反射获得字段的描述信息

if(cachedEnum.Contains(enumType.FullName)==false)

{

FieldInfo[]fields=enumType.GetFields();

ArrayListedAL=newArrayList();

foreach(FieldInfofiinfields)

{

object[]eds=fi.GetCustomAttributes(typeof(EnumDescription),false);

if(eds.Length!=1)continue;

((EnumDescription)eds[0]).fieldIno=fi;

edAL.Add(eds[0]);

}


cachedEnum.Add(enumType.FullName,(EnumDescription[])edAL.ToArray(typeof(EnumDescription)));

}

descriptions=(EnumDescription[])cachedEnum[enumType.FullName];

if(descriptions.Length<=0)thrownewNotSupportedException("枚举类型["+enumType.Name+"]未定义属性EnumValueDescription");


//按指定的属性冒泡排序

for(intm=0;m<descriptions.Length;m++)

{

//默认就不排序了

if(sortType==SortType.Default)break;


for(intn=m;n<descriptions.Length;n++)

{

EnumDescriptiontemp;

boolswap=false;


switch(sortType)

{

caseSortType.Default:

break;

caseSortType.DisplayText:

if(string.Compare(descriptions[m].EnumDisplayText,descriptions
.EnumDisplayText)>0)swap=true;

break;

caseSortType.Rank:

if(descriptions[m].EnumRank>descriptions
.EnumRank)swap=true;

break;

}


if(swap)

{

temp=descriptions[m];

descriptions[m]=descriptions
;

descriptions
=temp;

}

}

}


returndescriptions;

}


#endregion

}

}


下载地址:原文下载

3.NBear提供的绑定Enum到ASP.NET数据绑定控件的完美解决方案(博客园Teddy

(支持第三方枚举描述,支持二进制与过的枚举值)

原文:http://www.cnblogs.com/teddyma/archive/2007/05/25/759842.html

EnumDescriptionAttribute.cs 源码

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

usingSystem.Reflection;


namespaceNBear.Common

{

[AttributeUsage(AttributeTargets.Field,AllowMultiple=false,Inherited=true)]

publicclassEnumDescriptionAttribute:Attribute

{

privatestringdefaultDesc;


publicstringDefaultDescription

{

get

{

returndefaultDesc;

}

set

{

defaultDesc=value;

}

}


publicvirtualstringGetDescription(objectenumValue)

{

Check.Require(enumValue!=null,"enumValuecouldnotbenull.");


returnDefaultDescription??enumValue.ToString();

}


publicstaticstringGetDescription(TypeenumType,intenumIntValue)

{

System.Text.StringBuildersb=newSystem.Text.StringBuilder();

Dictionary<int,string>descs=EnumDescriptionAttribute.GetDescriptions(enumType);

Dictionary<int,string>.Enumeratoren=descs.GetEnumerator();

while(en.MoveNext())

{

if((enumIntValue&en.Current.Key)==en.Current.Key)

{

if(sb.Length==0)

{

sb.Append(en.Current.Value);

}

else

{

sb.Append(',');

sb.Append(en.Current.Value);

}

}

}


returnsb.ToString();

}


publicstaticDictionary<int,string>GetDescriptions(TypeenumType)

{

Check.Require(enumType!=null&&enumType.IsEnum,"enumTypemustbeanenumtype.");


FieldInfo[]fields=enumType.GetFields();

Dictionary<int,string>descs=newDictionary<int,string>();

for(inti=1;i<fields.Length;++i)

{

objectfieldValue=Enum.Parse(enumType,fields[i].Name);

object[]attrs=fields[i].GetCustomAttributes(true);

boolfindAttr=false;

foreach(objectattrinattrs)

{

if(typeof(EnumDescriptionAttribute).IsAssignableFrom(attr.GetType()))

{

descs.Add((int)fieldValue,((EnumDescriptionAttribute)attr).GetDescription(fieldValue));

findAttr=true;

break;

}

}

if(!findAttr)

{

descs.Add((int)fieldValue,fieldValue.ToString());

}

}


returndescs;

}

}

}


使用方法:

枚举定义(普通)

publicenumSimpleStatus

{

[NBear.Common.EnumDescription(DefaultDescription="DescofValue1")]

Value1=1,

[NBear.Common.EnumDescription(DefaultDescription="DescofValue2")]

Value2=2

}


枚举定义(继承)

publicclassMyEnumDescriptionAttribute:NBear.Common.EnumDescriptionAttribute

2{

3privatestaticstring[]customDescs=newstring[]{"customdescofValue1",null};//thesecondvalueisnullheretousetheDefaultDescriptionsetinenumdefinition

4

5publicoverridestringGetDescription(objectenumValue)

6{

7returncustomDescs[(int)enumValue]??base.GetDescription(enumValue);

8}

9}


使用EnumDescriptionAttribute以透明获取的枚举值描述信息。

调用EnumDescriptionAttribute.GetDescriptions(enumType)这个静态方法就可以得到指定枚举类型的所有枚举值的由EnumDescriptionAttribute或其继承类标注的描述信息。

【只为参考,引用于http://www.yaosansi.com/post/1375.html】
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: