using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace DS.Module.Core.Extensions { public static class EnumExtensions { // 枚举显示字典缓存 private static readonly ConcurrentDictionary> EnumDisplayValueDict = new(); // 枚举值字典缓存 private static readonly ConcurrentDictionary> EnumNameValueDict = new(); // 枚举类型缓存 private static ConcurrentDictionary _enumTypeDict = null; /// /// 获取枚举类型key与描述的字典(缓存) /// /// /// /// public static Dictionary GetEnumDescDictionary(Type enumType) { if (!enumType.IsEnum) throw new Exception("该类型不是枚举类型"); // 查询缓存 Dictionary enumDic = EnumDisplayValueDict.ContainsKey(enumType) ? EnumDisplayValueDict[enumType] : new Dictionary(); if (enumDic.Count == 0) { // 取枚举类型的Key/Value字典集合 enumDic = GetEnumDescDictionaryItems(enumType); // 缓存 EnumDisplayValueDict[enumType] = enumDic; } return enumDic; } /// /// 获取枚举类型key与描述的字典(没有描述则获取name) /// /// /// /// private static Dictionary GetEnumDescDictionaryItems(Type enumType) { // 获取类型的字段,初始化一个有限长度的字典 FieldInfo[] enumFields = enumType.GetFields(BindingFlags.Public | BindingFlags.Static); Dictionary enumDic = new(enumFields.Length); // 遍历字段数组获取key和name foreach (FieldInfo enumField in enumFields) { string fileValue = enumField.Name; var desc = enumField.GetDescriptionValue(); enumDic[fileValue] = desc != null && !string.IsNullOrEmpty(desc.Description) ? desc.Description : enumField.Name; } return enumDic; } /// /// 获取字段特性 /// /// /// /// public static T GetDescriptionValue(this FieldInfo field) where T : Attribute { // 获取字段的指定特性,不包含继承中的特性 object[] customAttributes = field.GetCustomAttributes(typeof(T), false); // 如果没有数据返回null return customAttributes.Length > 0 ? (T)customAttributes[0] : null; } } }