C# и Generics: как я могу обрабатывать обработку на основе типа? - PullRequest
3 голосов
/ 19 марта 2020

Я новичок в дженериках и пытаюсь создать обобщенный c метод 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);
}

Но в некоторых случаях, в зависимости от типа, я хотел бы, чтобы ответ читался с использованием ReadAsByteArrayAsyn c () или ReadAsStreamAsyn c () вместо ReadAsStringAsyn c ().

Я думаю, что я мог бы, вероятно, сделать getType () внутри метода и прочитать ответ, используя соответствующий метод, но мне интересно, может быть, есть лучший способ сделать это?

Это плохая идея / плохое использование дженериков в целом? Спасибо за любую информацию!

1 Ответ

5 голосов
/ 19 марта 2020

Используйте интерфейс:

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.

...