159 lines
4.5 KiB
C#
Raw Normal View History

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
}