C# 和泛型 : how can I handle processing based on type?

标签 c# generics dotnet-httpclient

我是泛型新手,我正在尝试为我的项目创建一个通用的 HTTP GET 方法(并可能将其扩展以处理 POST/PUT)。当响应基于字符串时,以下内容似乎可以正常工作:

private async Task<T> HttpGetAsync<T>(Uri uri)
{
    var httpRequestMessage = new HttpRequestMessage()
    {
        Method = HttpMethod.Get,
        RequestUri = uri,
        Headers =
        {
            { "Authorization", $"Basic {encodedCredentials}"},
            { "Cache-Control", "no-cache" }
        }
    };

    var response = await _httpClient.SendAsync(httpRequestMessage);
    var content = await response.Content.ReadAsStringAsync();
    return JsonConvert.DeserializeObject<T>(content);
}

但在某些情况下,根据类型,我希望使用 ReadAsByteArrayAsync() 或 ReadAsStreamAsync() 而不是 ReadAsStringAsync() 读取响应。

我认为我可以在方法中执行 getType() ,并使用适当的方法读取响应,但我想知道是否有更好的方法来做到这一点?

这是一个坏主意/泛型的错误用法吗?感谢您提供任何信息!

最佳答案

使用接口(interface):

interface IContentReader<T>
{
    T ReadAsync(HttpResponseMessage response);
}

private async Task<T> HttpGetAsync<T>(Uri uri, IContentReader<T> reader)
{
    var httpRequestMessage = new HttpRequestMessage()
    {
        Method = HttpMethod.Get,
        RequestUri = uri,
        Headers =
        {
            { "Authorization", $"Basic {encodedCredentials}"},
            { "Cache-Control", "no-cache" }
        }
    };

    var response = await _httpClient.SendAsync(httpRequestMessage);
    return await reader.ReadAsync(response);
}

并且您可以有 IContentReader<T> 的不同实现。 您可以根据 T 确定使用哪个实现.

关于C# 和泛型 : how can I handle processing based on type?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60755897/

相关文章:

c# - 从另一个 Web api 调用一个 Web api

c# - C#删除临时文件夹中的文件

c# - 在 SQL Server 2008 中处理来自 c# 的多个数据库更新

generics - 有限制的通配符类型的kotlin等效于Java注释字段是什么?

C# 可以隐藏继承的接口(interface)吗?

java - 使泛型类的内部类扩展 Throwable

c# - 发送不带 DefaultRequestHeaders 的 HttpClient 请求

.net - 将自定义字符串放入 System.Net.HttpClient 的 "Authorization" header 中

c# - .WPF 应用程序生成 <appname>.dll.config 而不是 <appname>.exe.config

c# - 如何使用 Entity Framework 以 DataGridView 可编辑和上下文跟踪更改的方式过滤数据?