using System; using System.Reflection; namespace Serein.Library.Utils { /// /// 枚举工具类,用于枚举转换器 /// public static class EnumHelper { /// /// 将字符串的字面量枚举值,转为对应的枚举值 /// /// 枚举 /// 枚举字面量 /// 返回的枚举值 /// 是否转换成功 public static bool TryConvertEnum(this string value, out TEnum result) where TEnum : struct, Enum { if (!string.IsNullOrEmpty(value) && Enum.TryParse(value, true, out TEnum tempResult) && Enum.IsDefined(typeof(TEnum), tempResult)) { result = tempResult; return true; } result = default; return false; } /// /// 将字符串的字面量枚举值,转为对应的枚举值 /// /// 枚举 /// 枚举字面量 /// 转换后的枚举值 public static TEnum ConvertEnum(this string value) where TEnum : struct, Enum { if (!string.IsNullOrEmpty(value) && Enum.TryParse(value, true, out TEnum tempResult) && Enum.IsDefined(typeof(TEnum), tempResult)) { return tempResult; } throw new NotImplementedException($"枚举值转换失败:value({value})to enum ( {typeof(TEnum).FullName})"); } /// /// 从枚举值的 BindValueAttribute 特性中 获取绑定的参数(用于绑定了某些内容的枚举值) /// /// 枚举类型 /// 返回类型 /// 枚举值 /// 选择什么参数 /// public static TResult GetBoundValue(TEnum enumValue, Func valueSelector) where TEnum : Enum { var fieldInfo = typeof(TEnum).GetField(enumValue.ToString()); var attribute = fieldInfo.GetCustomAttribute(); return attribute != null ? (TResult)valueSelector(attribute) : default; } public static object GetBoundValue(Type enumType,object enumValue, Func valueSelector) { var fieldInfo = enumType.GetField(enumValue.ToString()); var attribute = fieldInfo.GetCustomAttribute(); return attribute != null ? valueSelector(attribute) : default; } /// /// 从枚举值从获取自定义特性的成员,并自动转换类型 /// /// 枚举类型 /// 自定义特性类型 /// 返回类型 /// 枚举值 /// 特性成员选择 /// public static TResult GetAttributeValue(TEnum enumValue, Func valueSelector) where TEnum : Enum where TAttribute : Attribute { var fieldInfo = typeof(TEnum).GetField(enumValue.ToString()); var attribute = fieldInfo.GetCustomAttribute(); return attribute != null ? valueSelector(attribute) : default; } /// /// 从枚举值从获取自定义特性的成员,并自动转换类型 /// /// 枚举类型 /// 自定义特性类型 /// 枚举值 /// public static TAttribute GetAttribute(TEnum enumValue) where TEnum : Enum where TAttribute : Attribute { var fieldInfo = typeof(TEnum).GetField(enumValue.ToString()); var attribute = fieldInfo.GetCustomAttribute(); return attribute; } } }