using Furion.FriendlyException; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Reflection; namespace YBEE.EQM.Core; /// /// 枚举扩展 /// public static class EnumUtil { // 枚举显示字典缓存 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.E9001); } // 查询缓存 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.E9001); } // 查询缓存 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; } /// /// 获取枚举的Description /// /// /// public static string GetDescription(this System.Enum value) { return value.GetType().GetMember(value.ToString()).FirstOrDefault()?.GetCustomAttribute() ?.Description; } /// /// 获取枚举的Description /// /// /// public static string GetDescription(this object value) { return value.GetType().GetMember(value.ToString() ?? string.Empty).FirstOrDefault() ?.GetCustomAttribute()?.Description; } /// /// 将枚举转成枚举信息集合 /// /// /// public static List EnumToList(this Type type) { if (!type.IsEnum) throw new ArgumentException("Type '" + type.Name + "' is not an enum."); var arr = System.Enum.GetNames(type); return arr.Select(sl => { var item = System.Enum.Parse(type, sl); return new EnumEntity { Name = item.ToString(), Description = item.GetDescription(), Value = item.GetHashCode() }; }).ToList(); } /// /// 枚举ToList /// /// /// /// public static List EnumToList(this Type type) { if (!type.IsEnum) throw new ArgumentException("Type '" + type.Name + "' is not an enum."); var arr = System.Enum.GetNames(type); return arr.Select(name => (T)System.Enum.Parse(type, name)).ToList(); } }