如何在ASP.NET Core Swagger中展示DTO字符串属性对应枚举值(不改类型)
在ASP.NET Core Web API中为字符串属性关联枚举并在Swagger UI显示可选值
实现方案
可以通过自定义SchemaFilter结合标记属性的方式,在不修改DTO属性类型的前提下,让Swagger UI显示对应枚举的可选值。具体步骤如下:
1. 创建自定义标记属性
定义一个Attribute,用来标记哪些字符串属性需要关联指定枚举:
[AttributeUsage(AttributeTargets.Property)] public class EnumStringAttribute : Attribute { public Type EnumType { get; } public EnumStringAttribute(Type enumType) { EnumType = enumType; } }
2. 标记DTO中的目标属性
在需要关联枚举的字符串属性上添加上述Attribute:
public class FooDTO { public int Id { get; set; } [EnumString(typeof(FooColor))] public string Color { get; set; } // 有效值对应FooColor枚举 } public enum FooColor { Purple, Blue, Pink }
3. 实现自定义SchemaFilter
编写SchemaFilter,处理标记了EnumStringAttribute的属性,将枚举值注入到Swagger Schema中:
public class EnumStringSchemaFilter : ISchemaFilter { public void Apply(OpenApiSchema schema, SchemaFilterContext context) { if (context.MemberInfo is PropertyInfo propertyInfo) { var enumAttr = propertyInfo.GetCustomAttribute<EnumStringAttribute>(); if (enumAttr != null && enumAttr.EnumType.IsEnum) { var enumValues = Enum.GetNames(enumAttr.EnumType); // 将枚举值添加到Schema的枚举列表,Swagger UI会显示这些可选值 schema.Enum.Clear(); foreach (var value in enumValues) { schema.Enum.Add(new OpenApiString(value)); } // 更新字段描述,明确列出可选值 schema.Description = $"可选值:{string.Join(", ", enumValues)}"; } } } }
4. 注册SchemaFilter到Swagger
在Program.cs中配置Swagger时,注册自定义的SchemaFilter:
builder.Services.AddSwaggerGen(c => { c.SchemaFilter<EnumStringSchemaFilter>(); // 其他Swagger配置(比如文档信息、XML注释等) });
效果说明
配置完成后,在Swagger UI中查看FooDTO的Schema时,Color字段会:
- 在枚举值区域显示
Purple、Blue、Pink三个可选字符串 - 字段描述中明确列出所有可选值,方便API使用者参考
内容的提问来源于stack exchange,提问作者Superman.Lopez
相关产品推荐
相关产品推荐

