C# 和泛型:如何处理基于类型的处理?

C# and Generics: how can I handle processing based on type?

我是泛型的新手,我正在尝试为我的项目创建一个通用的 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(),并使用适当的方法读取响应,但我想知道是否有更好的方法来执行此操作?

泛型的一般用法不好吗?idea/a感谢您提供任何信息!

使用接口:

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.

确定使用哪个实现