using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Reflection; using Furion.FriendlyException; namespace Magic.Core; /// /// 枚举扩展 /// 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 GetEnumDictionary(Type enumType) { if (!enumType.IsEnum) throw Oops.Oh(ErrorCode.D1503); // 查询缓存 Dictionary enumDic = EnumNameValueDict.ContainsKey(enumType) ? EnumNameValueDict[enumType] : new Dictionary(); if (enumDic.Count == 0) { // 取枚举类型的Key/Value字典集合 enumDic = GetEnumDictionaryItems(enumType); // 缓存 EnumNameValueDict[enumType] = enumDic; } return enumDic; } /// /// 获取枚举对象Key与名称的字典 /// /// /// private static Dictionary GetEnumDictionaryItems(Type enumType) { // 获取类型的字段,初始化一个有限长度的字典 FieldInfo[] enumFields = enumType.GetFields(BindingFlags.Public | BindingFlags.Static); Dictionary enumDic = new(enumFields.Length); // 遍历字段数组获取key和name foreach (FieldInfo enumField in enumFields) { int intValue = (int)enumField.GetValue(enumType); enumDic[intValue] = enumField.Name; } return enumDic; } /// /// 获取枚举类型key与描述的字典(缓存) /// /// /// /// public static Dictionary GetEnumDescDictionary(Type enumType) { if (!enumType.IsEnum) throw Oops.Oh(ErrorCode.D1503); // 查询缓存 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) { int intValue = (int)enumField.GetValue(enumType); var desc = enumField.GetDescriptionValue(); enumDic[intValue] = desc != null && !string.IsNullOrEmpty(desc.Description) ? desc.Description : enumField.Name; } return enumDic; } /// /// 从程序集中查找指定枚举类型 /// /// /// /// public static Type TryToGetEnumType(Assembly assembly, string typeName) { // 枚举缓存为空则重新加载枚举类型字典 _enumTypeDict ??= LoadEnumTypeDict(assembly); // 按名称查找 if (_enumTypeDict.ContainsKey(typeName)) { return _enumTypeDict[typeName]; } return null; } /// /// 从程序集中加载所有枚举类型 /// /// /// private static ConcurrentDictionary LoadEnumTypeDict(Assembly assembly) { // 取程序集中所有类型 Type[] typeArray = assembly.GetTypes(); // 过滤非枚举类型,转成字典格式并返回 Dictionary dict = typeArray.Where(o => o.IsEnum).ToDictionary(o => o.Name, o => o); ConcurrentDictionary enumTypeDict = new(dict); return enumTypeDict; } }