RDG011: No se admiten parámetros de tipo
Valor | |
---|---|
Identificador de la regla | RDG011 |
La corrección es problemática o no problemática | Poco problemático |
Causa
El Generador de delegados de solicitudes emite este diagnóstico cuando un punto de conexión contiene un controlador de ruta que captura un tipo genérico.
Descripción de la regla
No se admiten los puntos de conexión que usan parámetros de tipo genérico. Los puntos de conexión dentro de MapEndpoints
producen este diagnóstico debido al parámetro genérico <T>
.
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<Todo>();
app.Run();
public static class RouteBuilderExtensions
{
public static IEndpointRouteBuilder MapEndpoints<T>(this IEndpointRouteBuilder app) where T : class, new()
{
app.MapPost("/input", (T value) => value);
app.MapGet("/result", () => new T());
app.MapPost("/input-with-wrapper", (Wrapper<T> value) => value);
app.MapGet("/async", async () =>
{
await Task.CompletedTask;
return new T();
});
return app;
}
}
record Wrapper<T>(T Value);
class Todo
{
public int Id { get; set; }
public string Task { get; set; }
}
[JsonSerializable(typeof(Wrapper<Todo>[]))]
internal partial class AppJsonSerializerContext : JsonSerializerContext
{
}
Cómo corregir infracciones
Quite el tipo genérico de los puntos de conexión.
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.MapTodoEndpoints();
app.Run();
public static class TodoRouteBuilderExtensions
{
public static IEndpointRouteBuilder MapTodoEndpoints(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;
}
}
record Wrapper<T>(T Value);
record Todo(int Id, string Task);
[JsonSerializable(typeof(Wrapper<Todo>[]))]
internal partial class AppJsonSerializerContext : JsonSerializerContext
{
}
Cuándo suprimir las advertencias
Esta advertencia puede suprimirse de forma segura. Si se suprime, el marco volverá a generar el delegado de solicitud en tiempo de ejecución.
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de