C# 获取枚举 Enum 变量值的 Description 属性

摘要:
如何在C#中读取枚举值的描述属性?有以下枚举:123456 public enum enum Langage{[System.ComponentModel.Description]Chinese,English}我们希望得到的是中文中的“Chinese”描述。123456789 publicstringGetEnumDescription{stringstr=enumValue.ToString();System.Reflection.FieldInfofield=enumValue.GetType().GetField;object[]objs=field.GetCustomAttributes;ifreturnstr;System.ComponentModel.DescriptionAttributeda=objs[0];returnda.Description;}调用GetEnumDescription后,它将返回“Chinese”。如果更改为EnumLanguage English。由于英语中没有定义Description,因此将直接返回枚举名称English。有时,方法的返回值是枚举类型,例如,用于描述登录结果:viewsourceprint?1PublicenumLoginResult2{3Success,4WrongPassword,5UserNotExist,6Orbidden,7Unknown8}当当前部分中的UI获得登录方法的返回结果时,它需要告诉用户登录是否成功以及登录失败的原因。在枚举类型enum中,不支持DisplayNameAttribute,但支持DescriptionAttribute,因此从DescriptionAttribute开始。编写一个通用方法并取出DescriptionAttribute。

在C#中如何读取枚举值的描述属性?

在C#中,有时候我们需要读取枚举值的描述属性,也就是说这个枚举值代表了什么意思。比如本文中枚举值 Chinese ,我们希望知道它代表意思的说明(即“中文”)。

有下面的枚举:

1
2
3
4
5
6
public enum EnumLanugage
{
    [System.ComponentModel.Description("中文")]
    Chinese,
    English
}

我们要获取的就是 Chinese 中的说明文字“中文”。

1
2
3
4
5
6
7
8
9
public string GetEnumDescription(Enum enumValue)
{
    string str = enumValue.ToString();
    System.Reflection.FieldInfo field = enumValue.GetType().GetField(str);
    object[] objs = field.GetCustomAttributes(typeof(System.ComponentModel.DescriptionAttribute), false);
    if (objs == null || objs.Length == 0) return str;
    System.ComponentModel.DescriptionAttribute da = (System.ComponentModel.DescriptionAttribute)objs[0];
    return da.Description;
}

调用 GetEnumDescription(EnumLanguage.Chinese) 后 将返回“中文”,如果换成 EnumLanguage.English ,由于在 English 上没有定义 Description ,将直接返回枚举名称 English 。


有些时候,某个方法的返回值是个枚举类型,比如描述登录结果:

1publicenumLoginResult
2{
3    Success,
4    WrongPassword,
5    UserNotExist,
6    Forbidden,
7    Unknown
8}

当前段UI获取到登陆方法的返回结果时,就需要告诉用户登录是否成功、什么原因失败的。如果直接使用 ToString() 方式直接返回枚举变量的名称,显然不合适。通常的做法是使用各 switch 来转换,弊端是要写过多的代码;或者构造一个 string[] msg ,再根据 LoginResult 的 int 值来相应的取,弊端是类型的int值必须是连续的或者 string[] msg 的个数大于或等于 枚举类型的最大 int 值 ,一一对应起来也比较麻烦 。
 
在 枚举类型 Enum 中,不支持 DisplayNameAttribute,但支持 DescriptionAttribute ,所以要从 DescriptionAttribute 入手。写一个通用方法,取出 DescriptionAttribute 即可。当然,为了使用方便,我们使用 .NET 3.5+ 支持的 扩展方法来实现:

01usingSystem;
02usingSystem.Collections.Generic;
03usingSystem.Linq;
04usingSystem.Text;
05usingSystem.ComponentModel;
06usingSystem.Reflection;
07  
08namespacecom.hetaoos.Utils.Extensions
09{
10    publicstaticclassExtensions
11    {
12        /// <summary>
13        /// 获取枚举变量值的 Description 属性
14        /// </summary>
15        /// <param name="obj">枚举变量</param>
16        /// <returns>如果包含 Description 属性,则返回 Description 属性的值,否则返回枚举变量值的名称</returns>
17        publicstaticstringGetDescription(thisobjectobj)
18        {
19            returnGetDescription(obj, false);
20        }
21  
22        /// <summary>
23        /// 获取枚举变量值的 Description 属性
24        /// </summary>
25        /// <param name="obj">枚举变量</param>
26        /// <param name="isTop">是否改变为返回该类、枚举类型的头 Description 属性,而不是当前的属性或枚举变量值的 Description 属性</param>
27        /// <returns>如果包含 Description 属性,则返回 Description 属性的值,否则返回枚举变量值的名称</returns>
28        publicstaticstringGetDescription(thisobjectobj, boolisTop)
29        {
30            if(obj == null)
31            {
32                returnstring.Empty;
33            }
34            try
35            {
36                Type _enumType = obj.GetType();
37                DescriptionAttribute dna = null;
38                if(isTop)
39                {
40                    dna = (DescriptionAttribute)Attribute.GetCustomAttribute(_enumType, typeof(DescriptionAttribute));
41                }
42                else
43                {
44                    FieldInfo fi = _enumType.GetField(Enum.GetName(_enumType, obj));
45                    dna = (DescriptionAttribute)Attribute.GetCustomAttribute(
46                       fi, typeof(DescriptionAttribute));
47                }
48                if(dna != null&& string.IsNullOrEmpty(dna.Description) == false)
49                    returndna.Description;
50            }
51            catch
52            {
53            }
54            returnobj.ToString();
55        }
56    }
57}

使用方法很简单:

01usingSystem;
02usingSystem.Collections.Generic;
03usingSystem.Linq;
04usingSystem.Windows.Forms;
05usingSystem.ComponentModel;
06usingcom.hetaoos.Utils.Extensions;//这一句是必须的,否则无法使用扩展方法
07usingSystem.Diagnostics;
08  
09namespacecom.hetaoos
10{
11    staticclassProgram
12    {
13        /// <summary>
14        /// 应用程序的主入口点。
15        /// </summary>
16        [STAThread]
17        staticvoidMain()
18        {
19            ProcessedDataResultType resultType = ProcessedDataResultType.BkgrdMap;
20            ProcessedDataWaringResult ret = newProcessedDataWaringResult() { 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));
25        }
26  
27        /// <summary>
28        /// 处理结果类型
29        /// </summary>
30        //[TypeConverter(typeof(EnumDescConverter))]
31        [Description("处理后的数据类型")]
32        publicenumProcessedDataResultType : byte
33        {
34            [Description("背景地图")]
35            BkgrdMap,
36            [Description("检测结果")]
37            WaringResult
38        }
39  
40        [Description("报警结果")]
41        publicclassProcessedDataWaringResult
42        {
43            [Description("结果类型")]
44            publicProcessedDataResultType ResultType { get; set; }
45        }
46    }
47}

输出结果如下:

1枚举类型的描述属性:处理后的数据类型
2单个枚举变量的描述属性:BkgrdMap --> 背景地图
3类类型的描述属性:报警结果
4类类型的属性的描述属性:WaringResult --> 检测结果  --> 处理后的数据类型

关联文章:

免责声明:文章转载自《C# 获取枚举 Enum 变量值的 Description 属性》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Json 的日期格式转化(时区标准化)20、EVE-NG华丽登场Openstack镜像,体验私有云!下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

原创 c# 封装的带CheckBox的DataGridViewColumnHeaderCell 源码部分 实现DataGridView列头带CheckBox控件实现全选功能,支持列头带标题

在国外的源码网站看到一个带CheckBox的源码的。可惜的是,他不支持 列头显示文字,而且全选功能是需要自己写好函数手动添加到他的事件里面。 它实现的办法是在cell直接绘制一个CheckBox框。而我这个是在cell里创建一个CheckBox对象,把Checkbox控件加载到DataGridView容器中,最后用这个CheckBox覆盖这个Cell。...

服务应用之WEB与WCF使用之见

APP_Code WEB: WebService.cs 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.Services; 6 7 /// <summary> 8 /...

文件创建及读取的方法

以前创建用       String filePath = HttpContext.Current.Server.MapPath(FileName);        if (!System.IO.File.Exists(filePath))// 创建文件            System.IO.File.Create(filePath);       ...

在Visual Studio中使用MonoTouch开发iOS应用程序(下):开发体验 狼人:

对于熟悉.NET程序员来说,编写iOS应用程序的最佳选择自然是MonoTouch。在上一篇文章里,我们已经在Mac OS X上安装了MonoTouch开发环境,并已经能够在Mac OS X和Windows之间共享文件。现在我们就可以来简单体验一下,如何使用Visual Studio,Interface Builder以及少量的MonoDevelop来开发一...

.net连接SAP的几种方式

  .net连接SAP的几种方式 一、 SAP .net connector 这是SAP专为.net连接开发的一个工具,简单方便,但是只支持VS2003.当然想在VS2003以上的版本使用可以选择在VS2003上包装下再用。 使用方法: 1.首先安装SAP .net connector,一路next即可 2.打开VS2003,新建一个项目,打开s...

解决 java.lang.UnsatisfiedLinkError:no ** in java.library.path in java.library.path 的异常

报错截图 大致的意思是说jvm在加载项目依赖时,找不到××这样一个library,导致该线程出现异常: Exception in thread "main" java.lang.UnsatisfiedLinkError: no ddlogapi in java.library.path 原因分析 当java应用需要用到本地类库(例如windows下的....