2026-04-12 16:11:20 +08:00

159 lines
4.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
}