您的位置:首页 > 编程语言 > C#

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

2010-10-30 10:59 519 查看

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

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

有下面的枚举:

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

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

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

viewsource

print?

1
public
enum
LoginResult
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即可。当然,为了使用方便,我们使用.NET3.5+支持的扩展方法来实现:

viewsource

print?

01
using
System;
02
using
System.Collections.Generic;
03
using
System.Linq;
04
using
System.Text;
05
using
System.ComponentModel;
06
using
System.Reflection;
07
08
namespace
com.hetaoos.Utils.Extensions
09
{
10
public
static
class
Extensions
11
{
12
///<summary>
13
///获取枚举变量值的Description属性
14
///</summary>
15
///<paramname="obj">枚举变量</param>
16
///<returns>如果包含Description属性,则返回Description属性的值,否则返回枚举变量值的名称</returns>
17
public
static
string
GetDescription(
this
object
obj)
18
{
19
return
GetDescription(obj,
false
);
20
}
21
22
///<summary>
23
///获取枚举变量值的Description属性
24
///</summary>
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)
29
{
30
if
(obj==
null
)
31
{
32
return
string
.Empty;
33
}
34
try
35
{
36
Type_enumType=obj.GetType();
37
DescriptionAttributedna=
null
;
38
if
(isTop)
39
{
40
dna=(DescriptionAttribute)Attribute.GetCustomAttribute(_enumType,
typeof
(DescriptionAttribute));
41
}
42
else
43
{
44
FieldInfofi=_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
return
dna.Description;
50
}
51
catch
52
{
53
}
54
return
obj.ToString();
55
}
56
}
57
}
使用方法很简单:

viewsource

print?

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

viewsource

print?

1
枚举类型的描述属性:处理后的数据类型
2
单个枚举变量的描述属性:BkgrdMap-->背景地图
3
类类型的描述属性:报警结果
4
类类型的属性的描述属性:WaringResult-->检测结果-->处理后的数据类型
关联文章:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: