C# 获取枚举上的 Description 特性值

有些时候,我们会利用枚举来进行数据映射,通过会在枚举上添加 Description 特性来标记映射的值。

本文介绍如何获取枚举上的描述。

枚举定义:

1
2
3
4
5
6
7
8
public enum BookType
{
[Descrption("语文")]
Chinese,

[Descrption("数学")]
Math
}

通过枚举获取描述:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/// <summary>
/// 获取枚举的描述值
/// </summary>
/// <param name="enum"></param>
/// <returns></returns>
public static string GetDescription(this Enum @enum)
{
string value = @enum.ToString();
FieldInfo field = @enum.GetType().GetField(value);
// 获取描述特性,禁止继承的特性
object[] objs = field.GetCustomAttributes(typeof(DescriptionAttribute), false);

// 当描述特性没有时,直接返回名称
if (objs.Length == 0)
return value;

DescriptionAttribute descriptionAttribute = (DescriptionAttribute)objs[0];

return descriptionAttribute.Description;
}

通过描述获取枚举:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/// <summary>
/// 通过描述获取枚举值
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="description"></param>
/// <returns></returns>
/// <exception cref="DllNotFoundException"></exception>
public static T GetEnumByDescription<T>(this string description) where T : Enum
{
FieldInfo[] fields = typeof(T).GetFields();

foreach(var field in fields)
{
object[] objs = field.GetCustomAttributes(typeof(DescriptionAttribute), false);
if(objs.Length>0 && objs[0] is DescriptionAttribute da && da.Description == description)
{
return (T)field.GetValue(null);
}
}

throw new DllNotFoundException($"not found {description}");
}