Compartir a través de


RDG005: tipo abstracto no válido

Valor
Identificador de la regla RDG005
La corrección es problemática o no problemática Poco problemático

Causa

Este diagnóstico lo emite el generador de delegados de solicitudes cuando un punto final contiene un controlador de ruta con un parámetro anotado con el atributo [AsParameters] que es un tipo abstracto.

Descripción de la regla

La implementación del enlace suplente a través del atributo [AsParameters] en las API mínimas solo admite tipos con implementaciones concretas. El uso de un parámetro con un tipo abstracto como en el ejemplo siguiente genera el diagnóstico.

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
{

}

Cómo corregir infracciones

Use un tipo concreto para el suplente:

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
{

}

Cuándo suprimir las advertencias

Esta advertencia no debe suprimirse. La supresión de la advertencia provocará una excepción en runtime asociada con la misma advertencia.