枚舉大家都不陌生,但是最近看到有的人,還在是頁面上寫死,如果枚舉增減時,還要去頁面去手動修改,今天我們來看看枚舉的處理方式,這里說一下,我用的測試程序是.net core 3.1。
不多墨跡,直接上代碼:
定義枚舉:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Text; namespace ConsoleApp1 { public enum Status { [Description("已刪除")] Deleted = -1, [Description("未處理")] Init = 0, [Description("正常")] Normal = 1 } }
枚舉的輔助類,這里說明一下,我是通過獲取枚舉上的特性來處理的:
EnumUtil.cs
using System; using System.Collections.Generic; using System.ComponentModel; using System.Reflection; using System.Runtime.Serialization; using System.Text; namespace ConsoleApp1 { public static class EnumUtil { /// <summary> /// 獲取枚舉的描述 /// </summary> /// <param name="obj"></param> /// <returns></returns> public static string GetDesc(Enum obj) { string objName = obj.ToString(); Type t = obj.GetType(); FieldInfo fi = t.GetField(objName); if (fi == null) return objName; DescriptionAttribute[] arrDesc = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false); if (arrDesc.Length > 0) return arrDesc[0].Description; else return objName; } /// <summary> /// 獲取枚舉的鍵值對集合 /// </summary> /// <param name="e"></param> /// <returns></returns> public static Dictionary<int, string> GetEnumIntNameDict(Enum e) { return GetEnumNameValueDict(e, (Object o) => { return Convert.ToInt32(o); }); } public static Dictionary<TOutput, string> GetEnumNameValueDict<TOutput>(Enum e, Converter<Object, TOutput> convert) { Type enumType = e.GetType(); if (!enumType.IsEnum) { throw new ArgumentException("參數必須是枚舉類型", "enumType"); } FieldInfo[] fields = enumType.GetFields(); if (fields != null) { Dictionary<TOutput, string> dict = new Dictionary<TOutput, string>(); foreach (FieldInfo f in fields) { if (f.Name.EndsWith("__")) continue; DescriptionAttribute[] attrs = (DescriptionAttribute[])f.GetCustomAttributes(typeof(DescriptionAttribute), false); string name = f.Name; if (attrs != null && attrs.Length == 1) { name = attrs[0].Description; } TOutput val = convert(f.GetValue(e)); dict.Add(val, name); } return dict; } return null; } /// <summary> /// 獲取枚舉的鍵值對集合 /// </summary> /// <param name="e"></param> /// <returns></returns> public static Dictionary<string, string> GetEnumVarNameDict(Enum e) { Type enumType = e.GetType(); if (!enumType.IsEnum) { throw new ArgumentException("參數必須是枚舉類型", "enumType"); } FieldInfo[] fields = enumType.GetFields(); if (fields != null) { Dictionary<string, string> dict = new Dictionary<string, string>(); foreach (FieldInfo f in fields) { if (f.Name.EndsWith("__")) continue; DescriptionAttribute[] attrs = (DescriptionAttribute[])f.GetCustomAttributes(typeof(DescriptionAttribute), false); string name = f.Name; if (attrs != null && attrs.Length == 1) { name = attrs[0].Description; } dict.Add(f.Name, name); } return dict; } return null; } private static SortedList<Enum, string> enumDesciptionDict = new SortedList<Enum, string>(); /// <summary> /// 獲取枚舉的描述 /// </summary> /// <param name="value"></param> /// <returns></returns> public static string GetDescription(this Enum value) { string description = string.Empty; if (enumDesciptionDict.TryGetValue(value, out description)) return description; FieldInfo field = value.GetType().GetField(value.ToString()); DescriptionAttribute attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute; if (attribute == null) enumDesciptionDict[value] = value.ToString(); else enumDesciptionDict[value] = attribute.Description; return enumDesciptionDict[value]; } /// <summary> /// 獲取特性 /// </summary> /// <param name="value"></param> /// <returns></returns> public static DescriptionAttribute GetAttribute(this Enum value) { FieldInfo field = value.GetType().GetField(value.ToString()); return Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute; } } }
定義一個調用類,當然你也可以直接調用:
CommonEnumsDict.cs
using System; using System.Collections.Generic; using System.Text; namespace ConsoleApp1 { public class CommonEnumsDict { public static readonly Dictionary<int, string> StatusDict; public static readonly Dictionary<string, string> StatusStrDict; static CommonEnumsDict() { StatusDict = EnumUtil.GetEnumIntNameDict(Status.Normal); StatusStrDict = EnumUtil.GetEnumVarNameDict(Status.Normal); } } }
最后調用:
Program.cs
using System; namespace ConsoleApp1 { class Program { static void Main(string[] args) { foreach (var item in CommonEnumsDict.StatusDict) { Console.WriteLine("key:" + item.Key + ",value:" + item.Value); } Console.WriteLine("--------------------------"); var PayValues = Enum.GetValues(typeof(Status)); foreach (var v in PayValues) { var name = EnumUtil.GetDesc((Status)v); Console.WriteLine("key:" + (int)v + ",value:" + name); } Console.WriteLine("--------------------------"); foreach (var item in CommonEnumsDict.StatusStrDict) { Console.WriteLine("key:" + item.Key + ",value:" + item.Value); } var del = Status.Deleted.GetAttribute(); Console.WriteLine("del:" + del.Description); Console.ReadLine(); } } }
結果:
key:-1,value:已刪除
key:0,value:未處理
key:1,value:正常
--------------------------
key:0,value:未處理
key:1,value:正常
key:-1,value:已刪除
--------------------------
key:Deleted,value:已刪除
key:Init,value:未處理
key:Normal,value:正常
del:已刪除
你最喜歡的代碼:點擊下載