发布于2026-07-23 阅读(0)
扫一扫,手机访问
在 .NET 项目里,经常会遇到需要给枚举值配上中文描述的场景。比如下面这个 UserStatus 枚举,定义了几个状态,每个状态都对应一个中文说明:
public enum UserStatus
{
[Description("未激活")]
Inactive = 0,
[Description("已激活")]
Active = 1,
[Description("已禁用")]
Disabled = 2,
[Description("待审核")]
Pending = 3
}
那么问题来了——怎么在代码里拿到某个枚举值对应的中文描述呢?这事儿其实不复杂,几步就能搞定,而且有两种常见的实现方式,咱们挨个说。
先定义一个自己的 DescriptionAttribute,用来存放中文描述信息。虽然 .NET 内置也有 DescriptionAttribute,但为了保持灵活性,这里先演示自定义的方式:
using System; ////// 枚举描述特性 /// public class DescriptionAttribute : Attribute { public string Description { get; } public DescriptionAttribute(string description) { Description = description; } }
把刚才定义的特性贴在枚举值上,就像文章开头展示的那样,这里就不再重复贴代码了。注意,如果你的项目已经引用了 System.ComponentModel,也可以直接用内置的 DescriptionAttribute,后面会讲到。
关键步骤来了——写一个扩展方法,通过反射读取枚举字段上的 DescriptionAttribute,返回对应的描述文本。如果没找到任何特性,就回退到枚举名称本身,这样不至于报错。
using System;
using System.ComponentModel;
using System.Reflection;
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();
// 尝试获取DescriptionAttribute
var attribute = field.GetCustomAttribute();
if (attribute != null)
return attribute.Description;
// 如果没有DescriptionAttribute,返回枚举名称
return value.ToString();
}
///
/// 获取枚举类型的所有值和描述(返回 int 键的字典)
///
public static Dictionary GetEnumDescriptions() where T : Enum
{
var result = new Dictionary();
var values = Enum.GetValues(typeof(T));
foreach (T value in values)
{
result.Add(Convert.ToInt32(value), value.GetDescription());
}
return result;
}
///
/// 获取枚举类型的所有值和描述(返回枚举键的字典)
///
public static Dictionary GetEnumDescriptionsDict() where T : Enum
{
return Enum.GetValues(typeof(T))
.Cast()
.ToDictionary(e => e, e => e.GetDescription());
}
}
代码写完了,验证一下效果。下面是一个简单的控制台示例,演示了三种常见用法:获取单个枚举值的描述、遍历所有枚举值、以及直接拿到字典:
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();
foreach (var item in statusDict)
{
Console.WriteLine($"值: {item.Key}, 描述: {item.Value}");
}
Console.ReadKey();
打印结果如下,完全符合预期:
Hello, World!
状态描述: 已激活
Inactive: 未激活
Active: 已激活
Disabled: 已禁用
Pending: 待审核
值: 0, 描述: 未激活
值: 1, 描述: 已激活
值: 2, 描述: 已禁用
值: 3, 描述: 待审核
如果你不想自己定义特性,直接使用 .NET 内置的 System.ComponentModel.DescriptionAttribute 会更省事。用法完全一样,只需把引用从自定义特性换成内置的即可。注意枚举定义和扩展方法里的引用都要改过来:
using System.ComponentModel;
public enum UserStatus
{
[Description("未激活")]
Inactive = 0,
[Description("已激活")]
Active = 1
}
// 扩展方法中的引用也改为 System.ComponentModel.DescriptionAttribute
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.DescriptionAttribute
var attribute = field.GetCustomAttribute();
if (attribute != null)
return attribute.Description;
return value.ToString();
}
}
两种方式核心逻辑一致,选哪种取决于你的项目风格和是否已经依赖了 System.ComponentModel。实际开发中,如果只是拿来做简单的枚举描述,直接内置的那个就够用了。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8