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

.NET 5.0中为特定枚举禁用Swagger的枚举转字符串转换

解决方案

你可以通过自定义Swagger Schema过滤器实现对特定枚举的类型展示控制,步骤如下:

步骤1:自定义Schema过滤器

创建实现ISchemaFilter接口的类,在类内判断枚举类型,如果是需要按数值展示的枚举(比如HttpStatusCode),就直接生成数值类型的Schema,移除默认的字符串枚举选项:

using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
using System.Net;

public class CustomEnumSchemaFilter : ISchemaFilter
{
    public void Apply(OpenApiSchema schema, SchemaFilterContext context)
    {
        // 单独指定HttpStatusCode枚举按数值展示
        if (context.Type == typeof(HttpStatusCode))
        {
            schema.Type = "integer";
            schema.Format = "int32";
            schema.Enum.Clear();
            return;
        }
        
        // 有其他需要按数值展示的枚举,可以继续追加判断条件
    }
}

步骤2:在Swagger配置中注册过滤器

修改你的AddSwaggerGen配置块,注册上述自定义过滤器:

services.AddSwaggerGen(c => {
    // 原有配置保持不变
    c.SwaggerDoc("v1", new OpenApiInfo {
        Version = "v1",
        Title = "API"
    });
    string xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
    string xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
    c.IncludeXmlComments(xmlPath);
    c.DocumentFilter<SignalRSwaggerGen.SignalRSwaggerGen>(new List<Assembly> { 
        typeof(NotificationUserHub).Assembly 
    });

    // 新增:注册自定义枚举Schema过滤器
    c.SchemaFilter<CustomEnumSchemaFilter>();
});

可选扩展:批量处理系统命名空间下的所有枚举

如果你需要将所有System命名空间下的系统枚举都按数值展示,不需要逐个指定,可以修改过滤器的判断逻辑:

public void Apply(OpenApiSchema schema, SchemaFilterContext context)
{
    if (context.Type.IsEnum && context.Type.Namespace.StartsWith("System."))
    {
        schema.Type = "integer";
        schema.Format = "int32";
        schema.Enum.Clear();
    }
}

轻量方案:仅修改个别属性的展示规则

如果只有零星几个属性需要按数值展示枚举,不需要全局配置,可以直接在属性上加特性标注:

public sealed class ErrorResponse {
    // 若使用Newtonsoft序列化加这个特性
    [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Int32Converter))]
    // 标注Swagger展示类型为数值
    [Swashbuckle.AspNetCore.Annotations.SwaggerSchemaType("integer")]
    public HttpStatusCode StatusCode { get; set; }

    public string Message { get; set; }
}

原理说明

全局配置的StringEnumConverter和AddSwaggerGenNewtonsoftSupport默认会把所有枚举识别为字符串类型展示,自定义Schema过滤器的优先级高于默认的枚举处理逻辑,可以覆盖指定类型的Schema生成规则,和实际的序列化行为保持一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 10:36:02