Compartir a través de


RDG006: parámetros de constructor no válidos

Valor
Identificador de la regla RDG006
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 de conexión contiene un controlador de ruta con un parámetro anotado con el atributo [AsParameters] que contiene un constructor no válido.

Descripción de la regla

Los tipos que se usan para el enlace suplente a través del atributo [AsParameters] deben contener un constructor parametrizado público donde todos los parámetros del constructor coinciden con las propiedades públicas declaradas en el tipo. El tipo TodoRequest genera este diagnóstico porque no hay ningún parámetro de constructor coincidente para la propiedad 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
{

}

Cómo corregir infracciones

Asegúrese de que todas las propiedades del tipo tengan un parámetro coincidente en el constructor.

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
{

}

Cuándo suprimir las advertencias

Esta advertencia no debe suprimirse. La supresión de la advertencia provoca una excepción en tiempo de ejecución asociada con la misma advertencia.