如何在C#的API响应中显示枚举(Enum)的描述信息?
在C#中让API返回带描述信息的枚举列表
方法一:手动转换为DTO(直观可控)
这种方式需要先给枚举成员添加描述特性,再通过扩展方法提取描述,最后封装成DTO返回。
给枚举添加描述特性
用System.ComponentModel.DescriptionAttribute给每个枚举成员加上描述:using System.ComponentModel; public enum OrderStatus { [Description("待支付")] PendingPayment, [Description("已支付")] Paid, [Description("已发货")] Shipped, [Description("已完成")] Completed }写扩展方法提取描述
封装一个通用方法,用来获取任意枚举成员的描述:using System.ComponentModel; using System.Reflection; public static class EnumExtensions { public static string GetDescription(this Enum enumValue) { var fieldInfo = enumValue.GetType().GetField(enumValue.ToString()); var descriptionAttr = fieldInfo?.GetCustomAttribute<DescriptionAttribute>(); // 如果没有加描述,就返回枚举本身的名称 return descriptionAttr?.Description ?? enumValue.ToString(); } }创建DTO封装返回数据
定义一个数据传输对象,用来包含枚举的数值、名称和描述:public class EnumDto { public int Value { get; set; } public string Name { get; set; } public string Description { get; set; } }在API接口中转换并返回
把枚举集合转换成DTO集合后返回:[HttpGet("order-statuses")] public IActionResult GetOrderStatuses() { var statusList = Enum.GetValues(typeof(OrderStatus)) .Cast<OrderStatus>() .Select(status => new EnumDto { Value = (int)status, Name = status.ToString(), Description = status.GetDescription() }) .ToList(); return Ok(statusList); }
方法二:自定义JSON转换器(全局生效)
如果希望所有返回枚举的API都自动带上描述,可以用ASP.NET Core的自定义JSON转换器,不用每次手动转DTO。
实现自定义Json转换器
继承JsonConverter<Enum>,重写序列化逻辑:using System.Text.Json; using System.Text.Json.Serialization; public class EnumWithDescriptionConverter : JsonConverter<Enum> { // 反序列化逻辑(如果需要接收枚举参数的话) public override Enum Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { return (Enum)Enum.Parse(typeToConvert, reader.GetString()); } // 序列化逻辑,输出包含描述的对象 public override void Write(Utf8JsonWriter writer, Enum value, JsonSerializerOptions options) { writer.WriteStartObject(); writer.WriteNumber("Value", Convert.ToInt32(value)); writer.WriteString("Name", value.ToString()); writer.WriteString("Description", value.GetDescription()); writer.WriteEndObject(); } }注册转换器到全局配置
在Program.cs中添加JSON转换器:var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new EnumWithDescriptionConverter()); }); var app = builder.Build(); // 其他中间件配置... app.MapControllers(); app.Run();直接返回枚举集合
现在API可以直接返回枚举类型的集合,序列化后会自动包含描述:[HttpGet("order-statuses")] public IEnumerable<OrderStatus> GetOrderStatuses() { return Enum.GetValues(typeof(OrderStatus)).Cast<OrderStatus>(); }
内容的提问来源于stack exchange,提问作者Keshav Raghav
相关产品推荐
相关产品推荐

