C#和泛型:如何处理基于类型的处理? - 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);
}

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

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

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

参考方案

使用界面:

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确定要使用的实现。

当回复有时是一个对象有时是一个数组时,如何在使用改造时解析JSON回复? - java

我正在使用Retrofit来获取JSON答复。这是我实施的一部分-@GET("/api/report/list") Observable<Bills> listBill(@Query("employee_id") String employeeID); 而条例草案类是-public static class…

Mongo汇总 - javascript

我的收藏中有以下文件{ "_id": ObjectId("54490b8104f7142f22ecc97f"), "title": "Sample1", "slug": "samplenews", "cat": …

如何在Wiremock中为JUNIT匹配精确的json - java

我正在使用Wiremock在Spring启动应用程序中模拟Junit的REST服务。我的问题是,我无法匹配多个匹配模式。 Junit.javaStringValuePattern pattern = WireMock.matching(".*"); givenThat(post(urlEqualTo("/softwares�…

jQuery DataTable TableTool在IE和Firefox中不起作用 - c#

我在MVC4 ASP.NET Web应用程序中使用Jquery DataTable TableTool。导出到Excel和PDF可以与Chrome完美配合。但是不能在IE和FireFox中使用。我的代码如下 dom: 'T<"clear">lfrtip', tableTools: { "sSwfP…

如何通过Ajax将数据发送到不同的元素? - php

script.js $(document).on("click", ".send", function (event) { $.ajax({ url: "update.php", data: { id: id, }, type: "POST", success: function…