using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Reflection; namespace IRaCIS.Core.Infrastructure.Extention { public static class EnumToSelectExtension { /// <summary> /// 将枚举转换成字典(枚举,自定义描述) /// </summary> /// <typeparam name="TEnum"></typeparam> /// <param name="exceptList">需要排除的枚举</param> /// <returns></returns> public static Dictionary<object, string> ToSelect<TEnum>( params TEnum[] exceptList) where TEnum : struct, Enum { var type = typeof(TEnum); var dict = new Dictionary<object, string>(); foreach (var value in Enum.GetValues<TEnum>()) //foreach (var value in type.GetEnumValues()) { var attr = type.GetField(value.ToString()) .GetCustomAttribute<DescriptionAttribute>(); if (attr is null || exceptList.Contains(value)) continue; var key = type.GetFields().FirstOrDefault(t=>t.Name== value.ToString()).GetRawConstantValue(); dict[key] = attr.Description; } return dict; } /// <summary> /// 扩展方法,获得枚举的Description /// </summary> /// <param name="value">枚举值</param> /// <param name="nameInstead">当枚举值没有定义DescriptionAttribute,是否使用枚举名代替,默认是使用</param> /// <returns>枚举的Description</returns> public static string GetDescription(this Enum value, Boolean nameInstead = true) { Type type = value.GetType(); string name = Enum.GetName(type, value); if (name == null) { return null; } FieldInfo field = type.GetField(name); DescriptionAttribute attribute = System.Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute; if (attribute == null && nameInstead == true) { return name; } return attribute?.Description; } } }