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;
}
///
/// 从枚举值的 BindValueAttribute 特性中 获取绑定的参数(用于绑定了某些内容的枚举值)
///
///
///
///
///
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;
}
}
}