You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#的API响应中显示枚举(Enum)的描述信息?

在C#中让API返回带描述信息的枚举列表

方法一:手动转换为DTO(直观可控)

这种方式需要先给枚举成员添加描述特性,再通过扩展方法提取描述,最后封装成DTO返回。

  1. 给枚举添加描述特性
    用System.ComponentModel.DescriptionAttribute给每个枚举成员加上描述:

    using System.ComponentModel;
    
    public enum OrderStatus
    {
        [Description("待支付")]
        PendingPayment,
        [Description("已支付")]
        Paid,
        [Description("已发货")]
        Shipped,
        [Description("已完成")]
        Completed
    }
    
  2. 写扩展方法提取描述
    封装一个通用方法,用来获取任意枚举成员的描述:

    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();
        }
    }
    
  3. 创建DTO封装返回数据
    定义一个数据传输对象,用来包含枚举的数值、名称和描述:

    public class EnumDto
    {
        public int Value { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
    }
    
  4. 在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。

  1. 实现自定义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();
        }
    }
    
  2. 注册转换器到全局配置
    在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();
    
  3. 直接返回枚举集合
    现在API可以直接返回枚举类型的集合,序列化后会自动包含描述:

    [HttpGet("order-statuses")]
    public IEnumerable<OrderStatus> GetOrderStatuses()
    {
        return Enum.GetValues(typeof(OrderStatus)).Cast<OrderStatus>();
    }
    

内容的提问来源于stack exchange,提问作者Keshav Raghav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 23:03:17