using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Reflection; namespace Sai.Toolkit.Core.Helpers; public static class EnumHelpers { /// /// 获取当前枚举的值和枚举描述 /// /// public static List> GetAll() where T : IComparable, IFormattable, IConvertible { var list = new List>(); foreach (var field in typeof(T).GetFields()) { if (field.FieldType.IsEnum) { var tmp = field.GetValue(null); var enumValue = (Enum)tmp; var intValue = Convert.ToInt32(enumValue); var showName = enumValue.GetDescription(); list.Add(new KeyValuePair(intValue, showName)); } } return list; } /// /// 获取当前枚举值的描述,没有描述则返回空字符串 /// /// /// public static string GetDescription(this Enum value) { var description = string.Empty; var fieldInfo = value.GetType().GetField(value.ToString()); var attr = fieldInfo.GetCustomAttribute(); if (attr != null) { description = attr.Description; } return description; } public static Dictionary GetDescriptionEnumMap() where T : Enum { var results = new Dictionary(); var values = Enum.GetValues(typeof(T)); foreach (T value in values) { var member = typeof(T).GetMember(value.ToString()).FirstOrDefault(); if (member is null) { continue; } var customAttributes = member.GetCustomAttributes(typeof(DescriptionAttribute), false); var name = (customAttributes.FirstOrDefault() as DescriptionAttribute)?.Description; if (name != null) { results.Add(name, value); } } return results; } public static Dictionary GetDisplayEnumDict() where T : Enum { var results = new Dictionary(); var values = Enum.GetValues(typeof(T)); foreach (T value in values) { var member = typeof(T).GetMember(value.ToString()).FirstOrDefault(); if (member is null) { continue; } var atts = member.GetCustomAttributes(typeof(DisplayAttribute), false); var name = (atts.FirstOrDefault() as DisplayAttribute)?.Name; if (name != null) { results.Add(name, value); } } return results; } /// /// 获取描述的扩展方法 /// /// /// 枚举值 /// public static string GetEnumDescription(this Enum enumObj, int? value) { var fields = enumObj.GetType().GetFields(); for (int i = 1, count = fields.Length; i < count; i++) { if ((int)Enum.Parse(enumObj.GetType(), fields[i].Name) == value) { var enumAttributes = (DescriptionAttribute[])fields[i].GetCustomAttributes(typeof(DescriptionAttribute), false); if (enumAttributes.Length > 0) { return enumAttributes[0].Description; } } } return string.Empty; } private static void GetInfo(Type enumType) { _ = Enum.GetValues(enumType); //得到的是枚举类型,用于遍历枚举类 _ = Enum.GetNames(enumType); //得到的是枚举类的字符串 } public static List TraverseEnum() { List pName = new(); foreach (T p in Enum.GetValues(typeof(T))) { pName.Add(p.ToString()); } return pName; } public static bool TryParseByDescAttr(string value, out T result) where T : Enum { if (value is null) { throw new ArgumentNullException(nameof(value)); } var descs = GetDescriptionEnumMap(); return !descs.TryGetValue(value, out result) ? throw new InvalidEnumArgumentException() : true; } public static bool TryParseByDisplayAttr(string value, out T result) where T : Enum { if (value is null) { throw new ArgumentNullException(nameof(value)); } var dict = GetDisplayEnumDict(); return !dict.TryGetValue(value, out result) ? throw new InvalidEnumArgumentException() : true; } }