如何通过Swashbuckle修改Swagger泛型模型的Schema命名规则
完全可以通过Swashbuckle原生配置实现你要的泛型Schema命名效果,不需要修改业务模型代码,具体实现方式如下:
配置方法
在项目的Swagger服务注册逻辑中,替换默认的Schema ID生成规则即可,以.NET 6+ 项目为例:
builder.Services.AddSwaggerGen(options => { // 自定义Schema命名规则 options.CustomSchemaIds(type => GenerateSchemaId(type)); }); // 递归生成符合要求的Schema ID,支持嵌套泛型场景 string GenerateSchemaId(Type type) { // 非泛型类型直接返回类型名 if (!type.IsGenericType) return type.Name; // 截掉泛型类型名自带的`[参数数量]后缀,比如TheModel`1处理后得到TheModel var typeBaseName = type.Name.Split('`')[0]; // 递归处理所有泛型参数,避免嵌套泛型命名异常 var genericArgNames = type.GetGenericArguments() .Select(GenerateSchemaId); // 拼接为 泛型类名<参数1,参数2> 的格式 return $"{typeBaseName}<{string.Join(", ", genericArgNames)}>"; }
效果说明
配置完成后重新启动项目,Swagger生成的Schema列表会完全匹配你的预期:
- GenericModel
- TheModel
- AnotherGenericModel
- TheModel
注意事项
- 如果你的项目存在不同命名空间下的同名类型,为了避免Schema ID冲突,可以调整非泛型类型的返回值,拼接命名空间前缀即可,泛型部分的拼接逻辑无需改动。
- 上述配置对Swashbuckle.AspNetCore 5.0及以上版本均生效,嵌套泛型场景(比如
TheModel<List<GenericModel>>)也会自动生成符合阅读习惯的Schema名称,不会出现重名问题。
内容的提问来源于stack exchange,提问作者Gale Heusen
相关产品推荐
相关产品推荐

