获取Enum枚举值描述的几法方法
2012-04-07 11:51
429 查看
1.定义枚举时直接用中文
由于VS对中文支持的很不错,所以很多程序员都采用了此方案.
缺点:1.不适合多语言 2.感觉不太完美,毕竟大部分程序员大部分代码都使用英文
2.利用自定义属性定义枚举值的描述(博客园-大尾巴狼)
缺点:不适合多语言
原文:/article/5840756.html
枚举定义:
代码访问:
0、获得枚举类型的文字描述
1、获得某个枚举值的文字描述:
2、获得枚举中各个字段的定义数组:
如果需要排序,通过他的另一个重载
3、绑定到下拉框:
EnumDisplayText.cs源码
下载地址:原文下载
3.NBear提供的绑定Enum到ASP.NET数据绑定控件的完美解决方案(博客园-Teddy)
(支持第三方枚举描述,支持二进制与过的枚举值)
原文:http://www.cnblogs.com/teddyma/archive/2007/05/25/759842.html
EnumDescriptionAttribute.cs 源码
使用方法:
枚举定义(普通)
枚举定义(继承)
使用EnumDescriptionAttribute以透明获取的枚举值描述信息。
调用EnumDescriptionAttribute.GetDescriptions(enumType)这个静态方法就可以得到指定枚举类型的所有枚举值的由EnumDescriptionAttribute或其继承类标注的描述信息。
【只为参考,引用于http://www.yaosansi.com/post/1375.html】
由于VS对中文支持的很不错,所以很多程序员都采用了此方案.
缺点:1.不适合多语言 2.感觉不太完美,毕竟大部分程序员大部分代码都使用英文
2.利用自定义属性定义枚举值的描述(
缺点:不适合多语言
原文:
枚举定义:
[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数据绑定控件的完美解决方案(
(支持第三方枚举描述,支持二进制与过的枚举值)
原文:
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或其继承类标注的描述信息。
【只为参考,引用于
相关文章推荐
- 获取Enum枚举值描述的几法方法
- 获取Enum枚举值描述的几法方法
- 获取Enum枚举值描述的几法方法
- 获取Enum枚举值描述的几法方法
- 获取Enum枚举值描述的几法方法
- 获取Enum枚举值描述的几法方法
- 获取Enum枚举值描述的几法方法
- Enum 枚举值 (一) 获取描述信息
- c#中 Enum类型定义与获取值或描述方法
- Enum获取枚举值的方法
- c#中Enum类型定义与获取值或描述方法- 半语小马哥- CSDNBlog
- 图文描述Vs2005制作WEB应用程序安装包的方法[E8.Net正式用户可以找我们获取全部代码参考]
- 另一种获取系统服务描述表入口地址的方法
- 枚举转中文,通过反射方法与描述的方式获取
- 关于用 apache cxf中对于不是返回200错误的处理 ,获取错误描述文本的方法
- 获取Enum的扩张方法。
- 枚举的诸多使用方法enum--构造方法,普通方法method,获取枚举,实现接口
- 最新的swift 没有了fromraw方法,该如何获取初始值为x的枚举值
- C# 获取Enum枚举内容值或描述
- macos:获取c调用错误原因的描述,,,获取当前的工作目录的方法