【问题标题】:C# and Generics: how can I handle processing based on type?C# 和泛型:如何处理基于类型的处理?
【发布时间】:2020-03-19 11:05:25
【问题描述】:

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

一般来说,这是一个坏主意/对泛型的不好使用吗?感谢您提供任何信息!

【问题讨论】:

    标签: c# generics dotnet-httpclient


    【解决方案1】:

    使用接口:

    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&lt;T&gt; 实现。 您可以根据T 确定使用哪个实现。

    【讨论】:

    • 嗯,要求调用者传入一个IContentReader 实现对我来说感觉有点抽象。我可能会选择在这里只使用一个好的旧 switch 语句,也许它是一个单独的方法。
    • @ToddMenier 我同意你的观点,即调用者不应将接口传递给方法,这只是为了向 OP 展示如何将内容的读取从方法本身中抽象出来。实际上,IContentReader 或该类型的工厂可以注入到定义方法的类中,这将简化方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2018-09-29
    • 2014-04-29
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    相关资源
    最近更新 更多