6.13自定义泛型内容转换器

创建于 2026 年 8 月 17 日约 1 分钟读完

除了具体类型,框架同样支持泛型内容的转换。例如,定义如下泛型转换器:

cs
public class YourGenericClassContentConverter<T> : HttpContentConverterBase<YourGenericClass<T?>>{    /// <inheritdoc />    public override YourGenericClass<T?>? Read(HttpContentConverterContext context, CancellationToken cancellationToken = default)    {        // 实现同步转换逻辑    }    /// <inheritdoc />    public override Task<YourGenericClass<T?>?> ReadAsync(HttpContentConverterContext context, CancellationToken cancellationToken = default)    {        // 实现异步转换逻辑    }}

接下来在 Startup.csProgram.cs 文件中,配置并注册 HttpRemote 服务,以启用自定义泛型内容转换器功能:

cs
services.AddHttpRemote(builder =>{    builder.AddGenericHttpContentConverters(() => [ new(typeof(YourGenericClass<>), typeArgs => (IHttpContentConverter)Activator.CreateInstance(typeof(YourGenericClassContentConverter<>).MakeGenericType(typeArgs[0]))!) ]);});

以下示例展示了如何在发送 HTTP 远程请求时使用 YourGenericClassContentConverter 内容转换器:

使用 IHttpRemoteService 方式:

cs
var str = await httpRemoteService.GetAsAsync<YourGenericClass<string>>("https://furion.net/");

使用 IHttpContentConverterFactory 方式:

cs
public class YourService(IHttpContentConverterFactory httpContentConverterFactory)  // .NET8+ 支持主构造函数注入{    public async Task<YourGenericClass<string>?> GetStringAsync()    {        var httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, "https://furion.net/");        using var httpClient = new HttpClient();        var httpResponseMessage = await httpClient.SendAsync(httpRequestMessage);        // 调用 ReadAsync 方法将 HttpResponseMessage 对象转换为目标类型实例        var context = new HttpContentConverterContext(httpResponseMessage);        return await httpContentConverterFactory.GetConverter<YourGenericClass<string>>(context).ReadAsync(context);    }}