Enum擴展特性,代替中文屬性

  • 2019 年 10 月 10 日
  • 筆記

枚舉特性類:

    /// <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中的值元組應該更好一點。性能和顯示友好性都會有改進。