C# 添加枚举中文资源

C#

浏览数:59

2019-6-14

在业务开发过程中,添加枚举,在固定枚举值的同时,也需要中文的文案。

如果不想添加语言资源项、添加枚举转语资源项,可以使用特性标记。

属性描述 DescriptionAttribute

先看案例:

 1     public enum WheelchairDataType
 2     {
 3         [Description("前进加速")]
 4         ForwardAdd,
 5         [Description("前进减速")]
 6         ForwardReduce,
 7         [Description("后退加速")]
 8         BackwardAdd,
 9         [Description("后退减速")]
10         BackwardReduce,
11         [Description("转弯加速")]
12         TurningAdd,
13         [Description("转弯减速")]
14         TurningReduce
15     }
1     static void Main(string[] args)
2     {
3         var enumDescriptionDict = GetEnumDescriptionDict(WheelchairDataType.BackwardAdd.GetType());
4         var enumDescription = enumDescriptionDict[WheelchairDataType.BackwardAdd.ToString()];
5         Console.WriteLine($"{ WheelchairDataType.BackwardAdd.ToString()}:{enumDescription}");
6         Console.ReadLine();
7     }

以上,能够直接获取到枚举的描述值。所以我们可以用Description标记,取代我们经常要对枚举添加的中文注释,既是注释也是一种简便的语言项资源。

DescriptionAttribute继承自Attribute,所以枚举的中文标记值,可以通过反射获取:

 1         /// <summary>
 2         /// 获取枚举/中文字典
 3         /// </summary>
 4         /// <param name="enumType"></param>
 5         /// <returns></returns>
 6         public static Dictionary<string, string> GetEnumDescriptionDict(Type enumType)
 7         {
 8             Dictionary<string, string> dict = new Dictionary<string, string>();
 9             FieldInfo[] fields = enumType.GetFields();
10             foreach (FieldInfo field in fields)
11             {
12                 if (field.FieldType.IsEnum)
13                 {
14                     var customAttributes = field.GetCustomAttributes(typeof(DescriptionAttribute), false).ToList();
15                     dict.Add(field.Name, ((DescriptionAttribute)customAttributes[0]).Description);
16                 }
17             }
18 
19             return dict;
20         }

自定义枚举的描述标记EnumDetailAttribute

如果不想用DescriptionAttribute,或者需要额外的描述信息,可以自定义一个标记。比如:

1     public class EnumDetailAttribute : Attribute
2     {
3         public string Name { get; set; }
4 
5         public int SpecialOrder { get; set; }
6     }
 1     public enum WheelchairDataType
 2     {
 3         [EnumDetail(Name = "前进加速")]
 4         ForwardAdd,
 5         [EnumDetail(Name = "前进减速")]
 6         ForwardReduce,
 7         [EnumDetail(Name = "后退加速")]
 8         BackwardAdd,
 9         [EnumDetail(Name = "后退减速")]
10         BackwardReduce,
11         [EnumDetail(Name = "转弯加速")]
12         TurningAdd,
13         [EnumDetail(Name = "转弯减速")]
14         TurningReduce
15     }
1     static void Main(string[] args)
2     {
3         Console.WriteLine($"{ WheelchairDataType.BackwardAdd.ToString()}:{ WheelchairDataType.BackwardAdd.GetName()}");
4         Console.ReadLine();
5     }

枚举的描述值获取:


 1     public static class EnumExtensions
 2     {
 3         /// <summary>
 4         /// 获取枚举/中文字典
 5         /// </summary>
 6         /// <param name="enumValue"></param>
 7         /// <returns></returns>
 8         public static Dictionary<string, string> GetEnumDict<TEnum>(this TEnum enumValue) where TEnum : struct
 9         {
10             Type type = enumValue.GetType();
11 
12             Dictionary<string, string> dict = new Dictionary<string, string>();
13             FieldInfo[] fields = type.GetFields();
14             foreach (FieldInfo field in fields)
15             {
16                 if (field.FieldType.IsEnum)
17                 {
18                     var customAttributes = field.GetCustomAttributes(typeof(EnumDetailAttribute), false).ToList();
19                     dict.Add(field.Name, ((EnumDetailAttribute)customAttributes[0]).Name);
20                 }
21             }
22 
23             return dict;
24         }
25         /// <summary>
26         /// 获取枚举描述特性值
27         /// </summary>
28         /// <typeparam name="TEnum"></typeparam>
29         /// <param name="enumValue">枚举值</param>
30         /// <returns>枚举值的描述</returns>
31         public static string GetName<TEnum>(this TEnum enumValue) where TEnum : struct
32         {
33             Type type = enumValue.GetType();
34             //枚举的成员信息
35             foreach (var memberInfo in type.GetMembers())
36             {
37                 if (memberInfo.Name != enumValue.ToString()) continue;
38                 //获取自定义标记
39                 foreach (Attribute attr in memberInfo.GetCustomAttributes(typeof(EnumDetailAttribute), false))
40                 {
41                     var attribute = attr as EnumDetailAttribute;
42                     if (attribute == null) continue;
43                     return attribute.Name;
44                 }
45             }
46             return string.Empty;
47         }
48     }

 

作者:唐宋元明清2188