枚举为我们日常开发的可读性提供的非常好的支持,在使用枚举类型时,我们经常需要取名称和值,甚至有时候还需要取枚举类型的描述。通过反射,我们能获取到枚举类型的描述属性。当然举类型还可以赋上其他类型的属性。
public enum EnumCustom
{
[CategoryAttribute("性别")] //枚举类型可以赋上其他类型的属性
[Description("男")]
Male = 2,
[CategoryAttribute("性别")]
[Description("女")]
Female = 4,
}
枚举操作
static void Main(string[] args)
{
//根据枚举获取int值
int im = (int)EnumCustom.Male;
//取string值
string sm = EnumCustom.Male.ToString();
//根据int值获取枚举
EnumCustom eCustom = (EnumCustom)2;
//获取类型声明
Type type = typeof(EnumCustom);
//获取枚举值
Array array = Enum.GetValues(typeof(EnumCustom));
//获取枚举名称
string[] strs = Enum.GetNames(typeof(EnumCustom));
//遍历枚举
var fields = typeof(EnumCustom).GetFields(BindingFlags.Public | BindingFlags.Static);
if (fields != null && fields.Count() > 0)
{
foreach (var field in fields)
{
var i = (int)field.GetValue(null);//在派生类中重写时,返回给定对象支持的字段的值
var name = field.Name; //名称
var category = Attribute.GetCustomAttribute(field, typeof(CategoryAttribute), false) as CategoryAttribute; //获取属性
var fz = category?.Category;
var description = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute), false) as DescriptionAttribute; //获取属性
var des = description?.Description;
}
}
Console.ReadLine();
}
枚举处理方法
/// <summary>
/// 枚举类型通用处理工具
/// </summary>
public class EnumUtility
{
/// <summary>
/// 获取枚举类型的描述值
/// </summary>
/// <param name="type">枚举类型</param>
/// <param name="enumValue">枚举值</param>
/// <returns></returns>
public static string GetDescription(Type type, object enumValue)
{
if (!type.IsEnum)
return "";
string name = Enum.GetName(type, enumValue);
FieldInfo fieldInfo = type.GetField(name); //获取指定名称的公共字段
var description = Attribute.GetCustomAttribute(fieldInfo, typeof(DescriptionAttribute), false) as DescriptionAttribute;
return description?.Description ?? enumValue.ToString(); //当描述属性没有时,直接返回名称
}
/// <summary>
/// 获取枚举类型的描述值
/// </summary>
/// <param name="en">枚举值</param>
/// <returns></returns>
public static string GetDescription(Enum en)
{
var description = Attribute.GetCustomAttribute(en.GetType().GetField(en.ToString()), typeof(DescriptionAttribute), false) as DescriptionAttribute;
return description?.Description ?? en.ToString();
}
/// <summary>
/// 根据Description获取枚举
/// </summary>
/// <typeparam name="T">枚举类型</typeparam>
/// <param name="description">枚举描述</param>
/// <returns></returns>
public static T GetEnumName<T>(string description)
{
Type type = typeof(T);
//遍历枚举
FieldInfo[] fieldInfos = type.GetFields(BindingFlags.Public | BindingFlags.Static);
foreach (FieldInfo fieldInfo in fieldInfos)
{
var cur = Attribute.GetCustomAttribute(fieldInfo, typeof(DescriptionAttribute), false) as DescriptionAttribute;
string curDesc = cur?.Description ?? fieldInfo.Name;
if (curDesc == description)
return (T)fieldInfo.GetValue(null);
}
throw new ArgumentException($"{description} 未能找到对应的枚举。", "Description");
}
}