RDG012:无法解析不可访问的类型

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

原因

当终结点包含具有参数且没有适当辅助功能修饰符的路由处理程序时,请求委托生成器会发出此诊断。

规则说明

不支持那些使用不可访问类型(privateprotected)的终结点。 由于 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
{

}

何时禁止显示警告

可以安全消除此警告。 消除后,框架将回退为在运行时生成请求委托。