如何在Swashbuckle中自动解包Optional<T>类型?
搞定Swashbuckle自动解包Optional的问题
你的API请求模型用了Optional<T>包装原生类型,代码如下:
public class UserDetailsUpdateRequest { public Optional<string> Name { get; set; } public Optional<int> Age { get; set; } }
你不想手动给每个Optional<string>、Optional<int>这类类型单独配置CustomTypeMapping,希望Swashbuckle自动把它们当成原生的string、int处理,但之前尝试的SubTypesSelector方案没效果,下面给你两种可行的解决办法:
两种有效解决方案
方案一:自定义Schema过滤器自动替换
创建一个实现ISchemaFilter的类,检测到Optional<T>类型时,直接将其Schema替换为泛型参数T的Schema:
public class OptionalTypeSchemaFilter : ISchemaFilter { public void Apply(OpenApiSchema schema, SchemaFilterContext context) { var currentType = context.Type; // 判断当前类型是否为Optional<T>泛型类型 if (currentType.IsGenericType && currentType.GetGenericTypeDefinition() == typeof(Optional<>)) { var realType = currentType.GetGenericArguments()[0]; // 生成原生类型的Schema var realSchema = context.SchemaGenerator.GenerateSchema(realType, context.SchemaRepository); // 替换当前Schema的所有属性为原生类型的Schema属性 schema.Type = realSchema.Type; schema.Format = realSchema.Format; schema.Nullable = realSchema.Nullable; schema.Items = realSchema.Items; schema.Properties = realSchema.Properties; schema.Required = realSchema.Required; } } }
然后在Swagger配置中注册这个过滤器:
services.AddSwaggerGen(options => { options.SchemaFilter<OptionalTypeSchemaFilter>(); // 其他Swagger配置项... });
方案二:批量配置CustomTypeMapping
如果不想写过滤器,也可以通过反射批量为所有Optional<T>类型配置映射:
services.AddSwaggerGen(options => { var optionalGenericType = typeof(Optional<>); // 列出需要处理的原生类型,可根据项目需求扩展 var targetTypes = new[] { typeof(string), typeof(int), typeof(bool), typeof(DateTime) }; foreach (var type in targetTypes) { var optionalType = optionalGenericType.MakeGenericType(type); options.SchemaGeneratorOptions.CustomTypeMapping.Add(optionalType, () => options.SchemaGenerator.GenerateSchema(type, new SchemaRepository())); } // 其他Swagger配置项... });
如果需要自动覆盖所有可能的Optional<T>,可以用反射扫描项目中的相关类型,但实际项目中建议明确指定需要处理的类型,避免不必要的性能开销。
为什么你之前的方案不生效
SubTypesSelector是用来处理继承关系的(比如基类与派生类的Schema生成),而Optional<T>只是泛型包装类,和原生类型不存在继承关系,所以这个配置无法实现解包效果。
内容的提问来源于stack exchange,提问作者Svetlozar Stoichkov
相关产品推荐
相关产品推荐

