RDG012:无法解析不可访问的类型
值 | |
---|---|
规则 ID | RDG012 |
修复是中断修复还是非中断修复 | 非中断 |
原因
当终结点包含具有参数且没有适当辅助功能修饰符的路由处理程序时,请求委托生成器会发出此诊断。
规则说明
不支持那些使用不可访问类型(private
或 protected
)的终结点。
由于 Todo
类型具有 private
辅助功能修饰符,因此 MapEndpoints
中的终结点会生成此诊断信息。
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.MapEndpoints();
app.Run();
public static class TodoRouteBuilderExtensions
{
public static IEndpointRouteBuilder MapEndpoints(this IEndpointRouteBuilder app)
{
app.MapPost("/input", (Todo value) => value);
app.MapGet("/result", () => new Todo(1, "Walk the dog"));
app.MapPost("/input-with-wrapper", (Wrapper<Todo> value) => value);
app.MapGet("/async", async () =>
{
await Task.CompletedTask;
return new Todo(1, "Walk the dog");
});
return app;
}
private record Todo(int Id, string Task);
}
record Wrapper<T>(T Value);
[JsonSerializable(typeof(Wrapper<TodoRouteBuilderExtensions.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.MapEndpoints();
app.Run();
public static class TodoRouteBuilderExtensions
{
public static IEndpointRouteBuilder MapEndpoints(this IEndpointRouteBuilder app)
{
app.MapPost("/input", (Todo value) => value);
app.MapGet("/result", () => new Todo(1, "Walk the dog"));
app.MapPost("/input-with-wrapper", (Wrapper<Todo> value) => value);
app.MapGet("/async", async () =>
{
await Task.CompletedTask;
return new Todo(1, "Walk the dog");
});
return app;
}
public record Todo(int Id, string Task);
}
record Wrapper<T>(T Value);
[JsonSerializable(typeof(Wrapper<TodoRouteBuilderExtensions.Todo>[]))]
internal partial class AppJsonSerializerContext : JsonSerializerContext
{
}
何时禁止显示警告
可以安全消除此警告。 消除后,框架将回退为在运行时生成请求委托。
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈