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
{
}
何时禁止显示警告
不应抑制此警告。 抑制该警告会导致与同一警告关联的运行时异常。
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈