枚举特性类:
/// <summary>
/// 枚举特性
/// </summary>
[AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = false)]
public class DescriptionAttribute : Attribute
{
/// <summary>
/// 排序
/// </summary>
public int Order { get; set; }
/// <summary>
/// 名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 定义描述名称
/// </summary>
/// <param name="name">名称</param>
public DescriptionAttribute(string name)
{
Name = name;
}
/// <summary>
/// 定义描述名称和排序
/// </summary>
/// <param name="name">名称</param>
/// <param name="order">排序</param>
public DescriptionAttribute(string name, int order)
{
Name = name;
Order = order;
}
}
枚举帮助类:
1 /// <summary>
2 /// 枚举帮助类
3 /// </summary>
4 public static class EnumTools
5 {
6 /// <summary>
7 /// 获取当前枚举值的描述和排序
8 /// </summary>
9 /// <param name="value"></param>
10 /// <returns>返回元组Tuple(string,int)</returns>
11 public static Tuple<string, int> GetDescription(this Enum value)
12 {
13 int order = 0;
14 string description = string.Empty;
15
16 Type type = value.GetType();
17
18 // 获取枚举
19 FieldInfo fieldInfo = type.GetField(value.ToString());
20
21 // 获取枚举自定义的特性DescriptionAttribute
22 object[] attrs = fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);
23 DescriptionAttribute attr = (DescriptionAttribute)attrs.FirstOrDefault(a => a is DescriptionAttribute);
24
25 description = fieldInfo.Name;
26
27 if (attr != null)
28 {
29 order = attr.Order;
30 description = attr.Name;
31 }
32 return new Tuple<string, int>(description, order);
33
34 }
35
36 /// <summary>
37 /// 获取当前枚举的所有描述
38 /// </summary>
39 /// <returns></returns>
40 public static List<KeyValuePair<int, string>> GetAll<T>()
41 {
42 return GetAll(typeof(T));
43 }
44
45 /// <summary>
46 /// 获取所有的枚举描述和值
47 /// </summary>
48 /// <param name="type"></param>
49 /// <returns></returns>
50 public static List<KeyValuePair<int, string>> GetAll(Type type)
51 {
52
53 List<EnumToolsModel> list = new List<EnumToolsModel>();
54
55 // 循环枚举获取所有的Fields
56 foreach (var field in type.GetFields())
57 {
58 // 如果是枚举类型
59 if (field.FieldType.IsEnum)
60 {
61 object tmp = field.GetValue(null);
62 Enum enumValue = (Enum)tmp;
63 int intValue = Convert.ToInt32(enumValue);
64 var dec = enumValue.GetDescription();
65 int order = dec.Item2;
66 string showName = dec.Item1; // 获取描述和排序
67 list.Add(new EnumToolsModel { Key = intValue, Name = showName, Order = order });
68 }
69 }
70
71 // 排序并转成KeyValue返回
72 return list.OrderBy(i => i.Order).Select(i => new KeyValuePair<int, string>(i.Key, i.Name)).ToList();
73
74 }
75 /// <summary>
76 /// 枚举Model
77 /// </summary>
78 partial class EnumToolsModel
79 {
80 public int Order { get; set; }
81 public string Name { get; set; }
82 public int Key { get; set; }
83 }
84
85 }
把原文中的out参数替换成返回元组,由于项目是vs2015开发,不能用c#7.0特性,否则用7.0中的值元组应该更好一点。性能和显示友好性都会有改进。