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

如何在C#中通过DTO文件让API返回枚举描述而非名称?

问题描述

我有一个名为FeeNameEnum的枚举,其值带有Description特性,希望API返回枚举对应的描述内容,但当前API响应返回的是枚举名称(比如AccountOpeningFee)。相关代码如下:

枚举代码

public enum FeeNameEnum
{
    [Description("Account Opening Fee (project proponent, General Account holder, Retail Aggregation Account and End User Account)")]
    AccountOpeningFee,
}

DTO文件代码

public class FeeScheduleDto
{
    public Guid Id { get; set; }
    public FeeNameEnum FeeName { get; set; }
    public string FeeNameName { get { return FeeName.ToString(); } }
}

请问有没有办法让API返回枚举的描述而非名称?

解决方案

方法1:扩展方法获取枚举描述

先编写枚举扩展方法,用来读取Description特性的值:

public static class EnumExtensions
{
    public static string GetDescription(this Enum enumValue)
    {
        var fieldInfo = enumValue.GetType().GetField(enumValue.ToString());
        var descriptionAttribute = fieldInfo?.GetCustomAttributes(typeof(DescriptionAttribute), false)
            .FirstOrDefault() as DescriptionAttribute;
        
        // 如果没有找到Description特性,返回枚举名称作为 fallback
        return descriptionAttribute?.Description ?? enumValue.ToString();
    }
}

修改DTO中的FeeNameName属性,调用扩展方法:

public string FeeNameName { get { return FeeName.GetDescription(); } }

这样API返回的FeeNameName字段就会是枚举的描述内容。

方法2:自定义JSON转换器(ASP.NET Core适用)

如果希望直接让枚举类型在序列化时输出描述,无需额外的DTO属性,可以自定义JSON转换器:

public class EnumDescriptionConverter : JsonConverter<Enum>
{
    public override Enum Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        // 反序列化逻辑,这里简单实现为根据字符串解析枚举
        var value = reader.GetString();
        return Enum.Parse(typeToConvert, value);
    }

    public override void Write(Utf8JsonWriter writer, Enum value, JsonSerializerOptions options)
    {
        var description = value.GetDescription(); // 复用上面的扩展方法
        writer.WriteStringValue(description);
    }
}

在Program.cs中注册转换器:

builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.Converters.Add(new EnumDescriptionConverter());
    });

之后DTO中的FeeName字段在序列化时会直接输出描述内容,无需保留FeeNameName属性。

方法3:改用DisplayAttribute(可选)

如果项目使用System.ComponentModel.DataAnnotations的Display特性,可调整扩展方法读取其属性:

public static string GetDisplayName(this Enum enumValue)
{
    var fieldInfo = enumValue.GetType().GetField(enumValue.ToString());
    var displayAttribute = fieldInfo?.GetCustomAttributes(typeof(DisplayAttribute), false)
        .FirstOrDefault() as DisplayAttribute;
    
    return displayAttribute?.Name ?? displayAttribute?.Description ?? enumValue.ToString();
}

内容的提问来源于stack exchange,提问作者saurav.rox

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 00:10:13