Net Core如何获取枚举值的中文描述
Net项目中有如下枚举值:
public enum UserStatus
{[Description("未激活")]Inactive = 0,[Description("已激活")]Active = 1,[Description("已禁用")]Disabled = 2,[Description("待审核")]Pending = 3
}
请问,如何获取其中某一个枚举值的描述呢?
在 .NET Core 中获取枚举值的中文描述,可以通过以下步骤实现:
1. 创建自定义特性
using System;/// <summary>
/// 枚举描述特性
/// </summary>
public class DescriptionAttribute : Attribute
{public string Description { get; }public DescriptionAttribute(string description){Description = description;}
}
2. 定义使用中文描述的枚举
public enum UserStatus
{[Description("未激活")]Inactive = 0,[Description("已激活")]Active = 1,[Description("已禁用")]Disabled = 2,[Description("待审核")]Pending = 3
}
3. 创建扩展方法
using System;
using System.ComponentModel;
using System.Reflection;public static class EnumExtensions
{/// <summary>/// 获取枚举值的描述/// </summary>/// <param name="value">枚举值</param>/// <returns>描述信息</returns>public static string GetDescription(this Enum value){if (value == null)return string.Empty;var field = value.GetType().GetField(value.ToString());if (field == null)return value.ToString();// 尝试获取DescriptionAttributevar attribute = field.GetCustomAttribute<DescriptionAttribute>();if (attribute != null)return attribute.Description;// 如果没有DescriptionAttribute,返回枚举名称return value.ToString();}/// <summary>/// 获取枚举类型的所有值和描述/// </summary>/// <typeparam name="T">枚举类型</typeparam>/// <returns>值和描述的字典</returns>public static Dictionary<int, string> GetEnumDescriptions<T>() where T : Enum{var result = new Dictionary<int, string>();var values = Enum.GetValues(typeof(T));foreach (T value in values){result.Add(Convert.ToInt32(value), value.GetDescription());}return result;}/// <summary>/// 获取枚举类型的所有值和描述/// </summary>/// <typeparam name="T">枚举类型</typeparam>/// <returns>值和描述的字典</returns>public static Dictionary<T, string> GetEnumDescriptionsDict<T>() where T : Enum{return Enum.GetValues(typeof(T)).Cast<T>().ToDictionary(e => e, e => e.GetDescription());}
}
4. 使用示例
Console.WriteLine("Hello, World!");// 示例1:获取单个枚举值的描述
UserStatus status = UserStatus.Active;
string description = status.GetDescription();
Console.WriteLine($"状态描述: {description}"); // 输出: 状态描述: 已激活// 示例2:遍历所有枚举值
foreach (UserStatus value in Enum.GetValues(typeof(UserStatus)))
{Console.WriteLine($"{value}: {value.GetDescription()}");
}// 示例3:获取所有枚举值的字典
var statusDict = EnumExtensions.GetEnumDescriptions<UserStatus>();
foreach (var item in statusDict)
{Console.WriteLine($"值: {item.Key}, 描述: {item.Value}");
}
Console.ReadKey();
打印结果:
Hello, World!
状态描述: 已激活
Inactive: 未激活
Active: 已激活
Disabled: 已禁用
Pending: 待审核
值: 0, 描述: 未激活
值: 1, 描述: 已激活
值: 2, 描述: 已禁用
值: 3, 描述: 待审核
5. 替代方案:使用 System.ComponentModel.DescriptionAttribute
如果不想创建自定义特性,也可以直接使用 .NET 内置的 DescriptionAttribute,代码如下:
using System.ComponentModel;public enum UserStatus
{[Description("未激活")]Inactive = 0,[Description("已激活")]Active = 1
}// 修改扩展方法中的引用
public static class EnumExtensions
{public static string GetDescription(this Enum value){if (value == null)return string.Empty;var field = value.GetType().GetField(value.ToString());if (field == null)return value.ToString();// 使用System.ComponentModel.DescriptionAttributevar attribute = field.GetCustomAttribute<DescriptionAttribute>();if (attribute != null)return attribute.Description;return value.ToString();}
}