159 lines
4.5 KiB
C#
159 lines
4.5 KiB
C#
using System.Collections.Concurrent;
|
||
using System.ComponentModel;
|
||
using System.Reflection;
|
||
|
||
namespace Easy.Core;
|
||
|
||
public static class EnumExtension
|
||
{
|
||
/// <summary>
|
||
/// 缓存
|
||
/// </summary>
|
||
private static readonly ConcurrentDictionary<string, string> EnumDic = new();
|
||
|
||
/// <summary>
|
||
/// 获取枚举上定义的Description
|
||
/// </summary>
|
||
/// <param name="value"></param>
|
||
/// <returns></returns>
|
||
public static string Description(this Enum value)
|
||
{
|
||
Type type = value.GetType();
|
||
string vs = value.ToString(), key = $"{type.FullName}_{vs}";
|
||
if (EnumDic.TryGetValue(key, out var description))
|
||
{
|
||
return description;
|
||
}
|
||
|
||
FieldInfo fieldInfo = type.GetField(vs);
|
||
if (fieldInfo != null && fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false).FirstOrDefault() is DescriptionAttribute descriptionAttribute)
|
||
{
|
||
string desc = descriptionAttribute.Description;
|
||
EnumDic.TryAdd(key, desc);
|
||
return desc;
|
||
}
|
||
|
||
return string.Empty;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 将 int 值转换为指定枚举类型
|
||
/// </summary>
|
||
/// <typeparam name="T">枚举类型</typeparam>
|
||
/// <param name="value">int 值</param>
|
||
/// <returns>枚举值,如果转换失败则返回 null</returns>
|
||
public static T? ToEnum<T>(this int value) where T : struct, Enum
|
||
{
|
||
if (Enum.IsDefined(typeof(T), value))
|
||
{
|
||
return (T)(object)value;
|
||
}
|
||
return null;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 将 int? 值转换为指定枚举类型
|
||
/// </summary>
|
||
/// <typeparam name="T">枚举类型</typeparam>
|
||
/// <param name="value">int? 值</param>
|
||
/// <returns>枚举值,如果转换失败则返回 null</returns>
|
||
public static T? ToEnum<T>(this int? value) where T : struct, Enum
|
||
{
|
||
if (!value.HasValue)
|
||
return null;
|
||
|
||
return value.Value.ToEnum<T>();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 将 long 值转换为指定枚举类型
|
||
/// </summary>
|
||
/// <typeparam name="T">枚举类型</typeparam>
|
||
/// <param name="value">long 值</param>
|
||
/// <returns>枚举值,如果转换失败则返回 null</returns>
|
||
public static T? ToEnum<T>(this long value) where T : struct, Enum
|
||
{
|
||
if (Enum.IsDefined(typeof(T), value))
|
||
{
|
||
return (T)(object)value;
|
||
}
|
||
return null;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 将 long? 值转换为指定枚举类型
|
||
/// </summary>
|
||
/// <typeparam name="T">枚举类型</typeparam>
|
||
/// <param name="value">long? 值</param>
|
||
/// <returns>枚举值,如果转换失败则返回 null</returns>
|
||
public static T? ToEnum<T>(this long? value) where T : struct, Enum
|
||
{
|
||
if (!value.HasValue)
|
||
return null;
|
||
|
||
return value.Value.ToEnum<T>();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取枚举所有值及其 Description 的字典
|
||
/// </summary>
|
||
/// <typeparam name="T">枚举类型</typeparam>
|
||
/// <returns>字典,Key为枚举值,Value为Description</returns>
|
||
public static Dictionary<T, string> GetDescriptionDictionary<T>() where T : struct, Enum
|
||
{
|
||
var result = new Dictionary<T, string>();
|
||
var values = Enum.GetValues(typeof(T));
|
||
|
||
foreach (var value in values)
|
||
{
|
||
if (value is T enumValue)
|
||
{
|
||
result[enumValue] = enumValue.Description();
|
||
}
|
||
}
|
||
|
||
return result;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取枚举所有值的列表(包含值和Description)
|
||
/// </summary>
|
||
/// <typeparam name="T">枚举类型</typeparam>
|
||
/// <returns>枚举选项列表</returns>
|
||
public static List<EnumOption<T>> GetEnumOptions<T>() where T : struct, Enum
|
||
{
|
||
var result = new List<EnumOption<T>>();
|
||
var values = Enum.GetValues(typeof(T));
|
||
|
||
foreach (var value in values)
|
||
{
|
||
if (value is T enumValue)
|
||
{
|
||
result.Add(new EnumOption<T>
|
||
{
|
||
Value = enumValue,
|
||
Description = enumValue.Description()
|
||
});
|
||
}
|
||
}
|
||
|
||
return result;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 枚举选项
|
||
/// </summary>
|
||
/// <typeparam name="T">枚举类型</typeparam>
|
||
public class EnumOption<T> where T : struct, Enum
|
||
{
|
||
/// <summary>
|
||
/// 枚举值
|
||
/// </summary>
|
||
public T Value { get; set; }
|
||
|
||
/// <summary>
|
||
/// 描述
|
||
/// </summary>
|
||
public string Description { get; set; } = string.Empty;
|
||
} |