在C#中如何读取枚举值的描述属性?
在C#中,有时候我们需要读取枚举值的描述属性,也就是说这个枚举值代表了什么意思。比如本文中枚举值Chinese,我们希望知道它代表意思的说明(即“中文”)。
有下面的枚举:
我们要获取的就是Chinese中的说明文字“中文”。
调用GetEnumDescription(EnumLanguage.Chinese)后将返回“中文”,如果换成EnumLanguage.English,由于在English上没有定义Description,将直接返回枚举名称English。
有些时候,某个方法的返回值是个枚举类型,比如描述登录结果:
viewsource
print?
当前段UI获取到登陆方法的返回结果时,就需要告诉用户登录是否成功、什么原因失败的。如果直接使用ToString()方式直接返回枚举变量的名称,显然不合适。通常的做法是使用各switch来转换,弊端是要写过多的代码;或者构造一个string[]msg,再根据LoginResult的int值来相应的取,弊端是类型的int值必须是连续的或者string[]msg的个数大于或等于枚举类型的最大int值,一一对应起来也比较麻烦。
在枚举类型Enum中,不支持DisplayNameAttribute,但支持DescriptionAttribute,所以要从DescriptionAttribute入手。写一个通用方法,取出DescriptionAttribute即可。当然,为了使用方便,我们使用.NET3.5+支持的扩展方法来实现:
viewsource
print?
02 | using System.Collections.Generic; |
05 | using System.ComponentModel; |
06 | using System.Reflection; |
08 | namespace com.hetaoos.Utils.Extensions |
10 | public static class Extensions |
13 | ///获取枚举变量值的Description属性 |
15 | ///<paramname="obj">枚举变量</param> |
16 | ///<returns>如果包含Description属性,则返回Description属性的值,否则返回枚举变量值的名称</returns> |
17 | public static string GetDescription( this object obj) |
19 | return GetDescription(obj, false ); |
23 | ///获取枚举变量值的Description属性 |
25 | ///<paramname="obj">枚举变量</param> |
26 | ///<paramname="isTop">是否改变为返回该类、枚举类型的头Description属性,而不是当前的属性或枚举变量值的Description属性</param> |
27 | ///<returns>如果包含Description属性,则返回Description属性的值,否则返回枚举变量值的名称</returns> |
28 | public static string GetDescription( this object obj, bool isTop) |
36 | Type_enumType=obj.GetType(); |
37 | DescriptionAttributedna= null ; |
40 | dna=(DescriptionAttribute)Attribute.GetCustomAttribute(_enumType, typeof (DescriptionAttribute)); |
44 | FieldInfofi=_enumType.GetField(Enum.GetName(_enumType,obj)); |
45 | dna=(DescriptionAttribute)Attribute.GetCustomAttribute( |
46 | fi, typeof (DescriptionAttribute)); |
48 | if (dna!= null && string .IsNullOrEmpty(dna.Description)== false ) |
使用方法很简单:
viewsource
print?
02 | using System.Collections.Generic; |
04 | using System.Windows.Forms; |
05 | using System.ComponentModel; |
06 | using com.hetaoos.Utils.Extensions; //这一句是必须的,否则无法使用扩展方法 |
07 | using System.Diagnostics; |
19 | ProcessedDataResultTyperesultType=ProcessedDataResultType.BkgrdMap; |
20 | ProcessedDataWaringResultret= new ProcessedDataWaringResult(){ResultType=ProcessedDataResultType.WaringResult}; |
21 | Debug.Print( "枚举类型的描述属性:{0}" ,resultType.GetDescription( true )); |
22 | Debug.Print( "单个枚举变量的描述属性:{0}-->{1}" ,resultType,resultType.GetDescription()); |
23 | Debug.Print( "类类型的描述属性:{0}" ,ret.GetDescription( true )); |
24 | Debug.Print( "类类型的属性的描述属性:{0}-->{1}-->{2}" ,ret.ResultType,ret.ResultType.GetDescription(),ret.ResultType.GetDescription( true )); |
30 | //[TypeConverter(typeof(EnumDescConverter))] |
31 | [Description( "处理后的数据类型" )] |
32 | public enum ProcessedDataResultType: byte |
41 | public class ProcessedDataWaringResult |
44 | public ProcessedDataResultTypeResultType{ get ; set ;} |
输出结果如下:
viewsource
print?
2 | 单个枚举变量的描述属性:BkgrdMap-->背景地图 |
4 | 类类型的属性的描述属性:WaringResult-->检测结果-->处理后的数据类型 |
关联文章: