2026-04-12 16:11:20 +08:00
|
|
|
|
using System.Collections.Concurrent;
|
|
|
|
|
|
using System.ComponentModel;
|
2025-12-17 10:32:52 +08:00
|
|
|
|
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;
|
|
|
|
|
|
}
|
2026-04-12 16:11:20 +08:00
|
|
|
|
|
|
|
|
|
|
/// <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;
|
2025-12-17 10:32:52 +08:00
|
|
|
|
}
|