zoukankan      html  css  js  c++  java
  • C# 添加枚举中文资源

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

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

    属性描述 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     }
    View Code
  • 相关阅读:
    Ubuntu 12.04 root用户登录设置
    E: 无法获得锁 /var/lib/dpkg/lock open???
    每日英语:HardWired To Hate Exercise?
    每日英语:How to say No to other people
    每日英语:Family Inc.
    每日英语:An Unhappy Middle in the Middle Kingdom
    每日英语:How Many People Really Use Sina Weibo
    每日英语:The Deeply Odd Lives of Chinese Bureaucrats
    每日英语:The Tyranny Of The Queen Bee
    每日英语:Economist: China Plenty Creative, Just Not in Right Ways
  • 原文地址:https://www.cnblogs.com/kybs0/p/10592631.html
Copyright © 2011-2022 走看看