NET 6 WebAPI(Swagger):让Swagger读取内联初始化默认值而非特性
配置Swagger读取属性内联初始化默认值的方案
Swagger默认不会自动读取属性的内联初始化值,要实现这个需求,你可以通过自定义SchemaFilter来解析并设置这些默认值,无需重复添加[DefaultValue]特性。
步骤1:创建自定义SchemaFilter类
这个类会遍历目标类型的属性,解析内联初始化的默认值,并同步到Swagger的Schema定义中:
using Microsoft.OpenApi.Models; using Swashbuckle.AspNetCore.SwaggerGen; using System.Reflection; public class InlineDefaultValueSchemaFilter : ISchemaFilter { public void Apply(OpenApiSchema schema, SchemaFilterContext context) { if (context.Type.IsClass && context.Type != typeof(string)) { foreach (var property in context.Type.GetProperties(BindingFlags.Public | BindingFlags.Instance)) { var defaultValue = GetInlineDefaultValue(property); if (defaultValue != null && schema.Properties.TryGetValue(property.Name, out var propertySchema)) { propertySchema.Default = ConvertToOpenApiPrimitive(defaultValue); } } } } private object? GetInlineDefaultValue(PropertyInfo property) { // 定位自动生成的私有 backing field(对应自动属性的内联初始化) var backingField = property.DeclaringType.GetField($"<{property.Name}>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance); if (backingField == null) return null; // 创建类实例并读取 backing field 的初始化值 var instance = Activator.CreateInstance(property.DeclaringType); return backingField.GetValue(instance); } private OpenApiPrimitive? ConvertToOpenApiPrimitive(object value) { return value switch { int val => new OpenApiInteger(val), string val => new OpenApiString(val), Guid val => new OpenApiString(val.ToString()), bool val => new OpenApiBoolean(val), decimal val => new OpenApiDecimal(val), float val => new OpenApiFloat(val), double val => new OpenApiDouble(val), DateTime val => new OpenApiDateTime(val), _ => null }; } }
步骤2:注册自定义Filter到Swagger
在项目的Swagger配置代码中(比如Program.cs),添加这个Filter:
builder.Services.AddSwaggerGen(c => { c.SchemaFilter<InlineDefaultValueSchemaFilter>(); // 其他Swagger配置(如文档标题、版本等) });
注意事项
- 对于带有副作用的初始化逻辑(比如
Guid.NewGuid()),每次生成Swagger文档时都会创建新实例,因此默认值会是新生成的Guid,而非固定值。如果需要固定默认值,建议单独处理这类属性。 - 方案依赖C#编译器自动生成的backing field命名格式(
<属性名>k__BackingField),不同版本编译器可能存在兼容性差异,需测试验证。 - 若需要支持复杂自定义类型的内联初始化,需扩展
ConvertToOpenApiPrimitive方法,添加对应类型的转换逻辑。
内容的提问来源于stack exchange,提问作者TronComputers
相关产品推荐
相关产品推荐

