using Fasterflect; using System.Collections.Concurrent; using System.ComponentModel; using System.Reflection; namespace DS.Module.Core; /// /// 枚举工具类 /// public static class EnumUtil { // 枚举显示字典缓存 private static readonly ConcurrentDictionary> EnumShowNameDict = new ConcurrentDictionary>(); /// /// 字符串转Enum /// /// 枚举 /// 字符串 /// 转换的枚举 public static T ToEnum(this string str) { try { return (T)Enum.Parse(typeof(T), str); } catch { return default(T); } } /// /// 获取到对应枚举的描述-没有描述信息,返回枚举值 /// /// /// public static string EnumDescription(this Enum @enum) { Type type = @enum.GetType(); string name = Enum.GetName(type, @enum); if (name == null) { return null; } FieldInfo field = type.GetField(name); if (!(Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) is DescriptionAttribute attribute)) { return name; } return attribute?.Description; } public static int ToEnumInt(this Enum e) { try { return e.GetHashCode(); } catch (Exception) { return 0; } } /// /// 获取枚举对象Key与名称的字典(缓存) /// /// /// public static Dictionary GetEnumDictionaryWithKey(this Type enumType) { if (!enumType.IsEnum) throw new ArgumentException("Type '" + enumType.Name + "' is not an enum."); // 查询缓存 var enumDic = EnumShowNameDict.ContainsKey(enumType) ? EnumShowNameDict[enumType] : new Dictionary(); if (enumDic.Count != 0) return enumDic; string[] fieldstrs = Enum.GetNames(enumType); // 取枚举类型的Key/Value字典集合 enumDic = fieldstrs.Select(item => { object[] arr = enumType.GetField(item).GetCustomAttributes(typeof(DescriptionAttribute), true); return new { Key = item, Val = ((DescriptionAttribute)arr[0]).Description }; }).ToDictionary(a => a.Key, b => b.Val); // 缓存 EnumShowNameDict[enumType] = enumDic; return enumDic; } /// /// 取得枚举值数 /// /// 枚举对象 /// 枚举值数 public static int GetEnumValue(this System.Enum EnumObject) { int intValue = (int)System.Enum.Parse(EnumObject.GetType(), EnumObject.ToString(), true); return intValue; } /// /// /// /// /// /// public static Dictionary EnumToDictionary() { if (!typeof(T).IsEnum) { throw new ArgumentException("T must be an enumerated type"); } var enumDictionary = new Dictionary(); Array enumValues = Enum.GetValues(typeof(T)); var enumNames = Enum.GetNames(typeof(T)); foreach (System.Enum value in enumValues) { enumDictionary.Add(EnumDescription(value), GetEnumValue(value)); } //for (int i = 0; i < enumValues.Length; i++) //{ // enumDictionary.Add(EnumDescription(enumNames[i]), (int)enumValues.GetValue(i)); //} return enumDictionary; } }