RDG006:无效的构造函数参数

规则 ID RDG006
修复是中断修复还是非中断修复 非中断

原因

当终结点包含的路由处理程序的参数通过包含无效构造函数的 [AsParameters] 属性进行了批注时,请求委托生成器会发出此诊断。

规则说明

通过 [AsParameters] 特性用于代理项绑定的类型必须包含公共参数化构造函数,其中构造函数的所有参数必须与类型上声明的公共属性匹配。 TodoRequest 类型会生成此诊断,因为 Todo 属性没有匹配的构造函数参数。

using System.Text.Json.Serialization;

var builder = WebApplication.CreateSlimBuilder(args);

builder.Services.ConfigureHttpJsonOptions(options =>
{
    options.SerializerOptions.TypeInfoResolverChain.Insert(0,
                                       AppJsonSerializerContext.Default);
});

var app = builder.Build();

app.MapPut("/v1/todos/{id}",
           ([AsParameters] TodoRequest todoRequest) => Results.Ok(todoRequest.Todo));

app.Run();

class TodoRequest(int id, string name)
{
    public int Id { get; set; } = id;
    public Todo? Todo { get; set; }
}

record Todo(int Id, string Task);

[JsonSerializable(typeof(Todo[]))]
internal partial class AppJsonSerializerContext : JsonSerializerContext
{

}

如何解决冲突

确保该类型上的所有属性在构造函数上都有匹配参数。

using System.Text.Json.Serialization;

var builder = WebApplication.CreateSlimBuilder(args);

builder.Services.ConfigureHttpJsonOptions(options =>
{
    options.SerializerOptions.TypeInfoResolverChain.Insert(0,
                                 AppJsonSerializerContext.Default);
});

var app = builder.Build();

app.MapPut("/v1/todos/{id}",
           ([AsParameters] TodoRequest todoRequest) => Results.Ok(todoRequest.Todo));

app.Run();

class TodoRequest(int id, Todo? todo)
{
    public int Id { get; set; } = id;
    public Todo? Todo { get; set; } = todo;
}

record Todo(int Id, string Task);

[JsonSerializable(typeof(Todo[]))]
internal partial class AppJsonSerializerContext : JsonSerializerContext
{

}

何时禁止显示警告

应抑制此警告。 抑制该警告会导致与同一警告关联的运行时异常。