Condividi tramite


RDG005: tipo astratto non valido

Valore
ID della regola RDG005
La modifica è dirompente o non dirompente Non separabile

Causa

Questa diagnostica viene generata dal generatore di delegati di richiesta quando un endpoint contiene un gestore di route con un parametro annotato con l'attributo [AsParameters] che è un tipo astratto.

Descrizione della regola

L'implementazione dell'associazione surrogata tramite l'attributo [AsParameters] nelle API minime supporta solo i tipi con implementazioni concrete. L'uso di un parametro con un tipo astratto come nell'esempio seguente produce la diagnostica.

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();

abstract class TodoRequest
{
    public int Id { get; set; }
    public Todo? Todo { get; set; }
}

record Todo(int Id, string Task);

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

}

Come correggere le violazioni

Usare un tipo concreto per il surrogato:

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
{
    public int Id { get; set; }
    public Todo? Todo { get; set; }
}

record Todo(int Id, string Task);

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

}

Quando eliminare gli avvisi

Questo avviso non deve essere eliminato. L'eliminazione dell'avviso comporterà un'eccezione di runtime associata allo stesso avviso.