// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 // // 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 // // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! namespace Admin.NET.Core; /// /// 枚举拓展 /// public static class EnumExtension { // 枚举显示字典缓存 private static readonly ConcurrentDictionary> EnumDisplayValueDict = new(); // 枚举值字典缓存 private static readonly ConcurrentDictionary> EnumNameValueDict = new(); // 枚举类型缓存 private static ConcurrentDictionary _enumTypeDict; /// /// 获取枚举对象Key与名称的字典(缓存) /// /// /// public static Dictionary GetEnumDictionary(this Type enumType) { if (!enumType.IsEnum) throw new ArgumentException("Type '" + enumType.Name + "' is not an enum."); // 查询缓存 var enumDic = EnumNameValueDict.TryGetValue(enumType, out var value) ? value : new Dictionary(); if (enumDic.Count != 0) return enumDic; // 取枚举类型的Key/Value字典集合 enumDic = GetEnumDictionaryItems(enumType); // 缓存 EnumNameValueDict[enumType] = enumDic; return enumDic; } /// /// 获取枚举对象Key与名称的字典 /// /// /// private static Dictionary GetEnumDictionaryItems(this Type enumType) { // 获取类型的字段,初始化一个有限长度的字典 var enumFields = enumType.GetFields(BindingFlags.Public | BindingFlags.Static); Dictionary enumDic = new(enumFields.Length); // 遍历字段数组获取key和name foreach (var enumField in enumFields) { var intValue = (int)enumField.GetValue(enumType)!; enumDic[intValue] = enumField.Name; } return enumDic; } /// /// 获取枚举类型key与描述的字典(缓存) /// /// /// /// public static Dictionary GetEnumDescDictionary(this Type enumType) { if (!enumType.IsEnum) throw new ArgumentException("Type '" + enumType.Name + "' is not an enum."); // 查询缓存 var enumDic = EnumDisplayValueDict.TryGetValue(enumType, out var value) ? value : new Dictionary(); if (enumDic.Count != 0) return enumDic; // 取枚举类型的Key/Value字典集合 enumDic = GetEnumDescDictionaryItems(enumType); // 缓存 EnumDisplayValueDict[enumType] = enumDic; return enumDic; } /// /// 获取枚举类型key与描述的字典(没有描述则获取name) /// /// /// /// private static Dictionary GetEnumDescDictionaryItems(this Type enumType) { // 获取类型的字段,初始化一个有限长度的字典 var enumFields = enumType.GetFields(BindingFlags.Public | BindingFlags.Static); Dictionary enumDic = new(enumFields.Length); // 遍历字段数组获取key和name foreach (var enumField in enumFields) { var 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); // 按名称查找 return _enumTypeDict.TryGetValue(typeName, out var value) ? value : null; } /// /// 从程序集中加载所有枚举类型 /// /// /// private static ConcurrentDictionary LoadEnumTypeDict(Assembly assembly) { // 取程序集中所有类型 var typeArray = assembly.GetTypes(); // 过滤非枚举类型,转成字典格式并返回 var dict = typeArray.Where(o => o.IsEnum).ToDictionary(o => o.Name, o => o); ConcurrentDictionary enumTypeDict = new(dict); return enumTypeDict; } /// /// 获取枚举的Description /// /// /// public static string GetEnumDescription(this Enum value) { return value.GetType().GetField(value.ToString())?.GetCustomAttribute()?.Description; } /// /// 获取枚举的Description /// /// /// public static string GetEnumDescription(this object value) { return value.GetType().GetField(value.ToString()!)?.GetCustomAttribute()?.Description; } /// /// 获取枚举的Theme /// /// /// public static string GetTheme(this object value) { return value.GetType().GetField(value.ToString()!)?.GetCustomAttribute()?.Theme; } /// /// 将枚举转成枚举信息集合 /// /// /// public static List EnumToList(this Type type) { if (!type.IsEnum) throw new ArgumentException("Type '" + type.Name + "' is not an enum."); var arr = Enum.GetNames(type); return arr.Select(sl => { var item = Enum.Parse(type, sl); return new EnumEntity { Name = item.ToString(), Describe = item.GetEnumDescription() ?? item.ToString(), Theme = item.GetTheme() ?? string.Empty, 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 = Enum.GetNames(type); return arr.Select(name => (T)Enum.Parse(type, name)).ToList(); } } /// /// 枚举实体 /// public class EnumEntity { /// /// 枚举的描述 /// public string Describe { get; set; } /// /// 枚举的样式 /// public string Theme { get; set; } /// /// 枚举名称 /// public string Name { get; set; } /// /// 枚举对象的值 /// public int Value { get; set; } }