如何在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
相关产品推荐
相关产品推荐

