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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 04:15:40