在C#开发过程中,枚举类型常用于定义一组固定的常量值,比如订单状态、用户角色等场景。实际业务里经常需要把枚举值转换为可读性更强的字符串,用于界面展示、日志记录或者接口返回。不同的转换需求对应不同的实现方式,下面逐一介绍常见的枚举转字符串方法。

一、使用枚举自带的ToString方法
这是最基础的枚举转字符串方式,所有枚举类型都继承了Enum类的ToString方法,直接调用就能得到枚举成员的名称字符串。
首先定义一个测试用的枚举类型:
// 定义订单状态枚举
public enum OrderStatus
{
Pending, // 待处理
Paid, // 已支付
Shipped, // 已发货
Completed // 已完成
}
调用ToString方法的示例:
OrderStatus status = OrderStatus.Paid; // 直接调用ToString方法转换 string statusStr = status.ToString(); // 输出结果为 "Paid" Console.WriteLine(statusStr);
这种方式的优点是简单直接,不需要额外代码,缺点是只能得到枚举成员的定义名称,无法返回自定义的友好描述。
二、获取枚举的Description自定义属性值
如果需要在枚举成员上定义自定义的展示文本,可以给枚举成员添加Description特性,再通过反射读取该特性的值转换为字符串。
首先修改枚举定义,添加Description特性:
using System.ComponentModel;
// 带Description特性的枚举定义
public enum OrderStatus
{
[Description("待处理")]
Pending,
[Description("已支付")]
Paid,
[Description("已发货")]
Shipped,
[Description("已完成")]
Completed
}
然后编写通用的获取Description值的方法:
using System.ComponentModel;
using System.Reflection;
public static class EnumHelper
{
/// <summary>
/// 获取枚举成员的Description特性值,如果没有定义Description则返回枚举名称
/// </summary>
/// <param name="enumValue">枚举值</param>
/// <returns>对应的字符串</returns>
public static string GetDescription(Enum enumValue)
{
// 获取枚举值的类型
Type type = enumValue.GetType();
// 获取枚举成员的名称
string memberName = Enum.GetName(type, enumValue);
if (string.IsNullOrEmpty(memberName))
{
return enumValue.ToString();
}
// 获取枚举成员的FieldInfo
FieldInfo field = type.GetField(memberName);
if (field == null)
{
return enumValue.ToString();
}
// 获取Description特性
DescriptionAttribute attribute = field.GetCustomAttribute<DescriptionAttribute>();
// 如果存在Description特性则返回其值,否则返回枚举名称
return attribute == null ? enumValue.ToString() : attribute.Description;
}
}
调用示例:
OrderStatus status = OrderStatus.Shipped; string desc = EnumHelper.GetDescription(status); // 输出结果为 "已发货" Console.WriteLine(desc);
这种方式的优点是支持自定义友好描述,适合需要展示给用户看的场景,缺点是需要使用反射,性能略低于直接使用ToString方法,如果频繁调用建议做缓存优化。
三、使用字典映射的方式转换
如果不想使用反射,也可以提前把枚举值和对应的字符串放到字典里,通过字典查询的方式实现转换,这种方式性能更好,也方便统一管理映射关系。
实现示例:
using System.Collections.Generic;
public static class OrderStatusMapper
{
// 定义枚举和字符串的映射字典
private static readonly Dictionary<OrderStatus, string> _statusMap = new Dictionary<OrderStatus, string>
{
{ OrderStatus.Pending, "待处理" },
{ OrderStatus.Paid, "已支付" },
{ OrderStatus.Shipped, "已发货" },
{ OrderStatus.Completed, "已完成" }
};
/// <summary>
/// 根据枚举值获取对应的字符串
/// </summary>
/// <param name="status">枚举值</param>
/// <returns>映射的字符串,如果没有映射则返回枚举名称</returns>
public static string GetString(OrderStatus status)
{
if (_statusMap.TryGetValue(status, out string value))
{
return value;
}
return status.ToString();
}
}
调用示例:
OrderStatus status = OrderStatus.Completed; string str = OrderStatusMapper.GetString(status); // 输出结果为 "已完成" Console.WriteLine(str);
这种方式的优点是性能好,不需要反射,映射关系清晰易维护,缺点是需要手动维护字典内容,如果枚举成员有变动需要同步更新字典。
四、不同方法的适用场景对比
下面通过表格对比三种方法的适用场景:
| 转换方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| ToString方法 | 实现简单,无需额外代码 | 只能返回枚举定义名称,无法自定义描述 | 只需要枚举原始名称的场景,比如日志记录 |
| Description特性+反射 | 支持自定义描述,枚举定义和描述绑定在一起 | 使用反射,性能略低,需要额外编写通用方法 | 需要自定义友好描述,且枚举成员变动不频繁的场景 |
| 字典映射 | 性能好,映射关系清晰,易维护 | 需要手动维护字典,枚举变动要同步更新 | 性能要求高,或者映射关系需要灵活配置的场景 |
五、注意事项
- 如果枚举值有
Flags特性,多个枚举值组合时,ToString方法会返回用逗号分隔的组合名称,比如[Flags] enum Permission { Read = 1, Write = 2 },Permission.Read | Permission.Write调用ToString会得到"Read, Write"。 - 使用反射获取
Description特性时,如果频繁调用建议把反射结果缓存起来,避免重复反射带来的性能损耗。 - 字典映射的方式如果枚举成员较多,初始化字典的代码会比较长,也可以考虑从配置文件读取映射关系,提升灵活性。
C#enum_to_string枚举转换ToString方法Description属性修改时间:2026-06-21 20:30:46