包装任务以转换其返回值

本文关键字:返回值 转换 任务 包装 | 更新日期: 2023-09-27 18:24:57

HttpClientSendAsync方法返回一个Task<HttpResponseMessage>

我想做的是有一个Task<T>来包装这个任务,并将响应转换为T的实例。例如,如果我希望响应包含SomeCustomObject的JSON表示,那么我会得到这样的结果:

public T GetAsT<T> (HttpRequestMessage request)
{
    Task<HttpResponseMessage> apiCall = Client.SendAsync(request)
    SomeCustomObject sco = await Wrap (apiCall);
    return sco;
}

我似乎不能让这种事发生。

包装任务以转换其返回值

沿着这些线的东西可能会切断芥末:

public async Task<T> GetAsT<T> (HttpRequestMessage request)
{
    HttpResponseMessage apiCall = await Client.SendAsync(request);
    string data = await apiCall.Content.ReadAsStringAsync();
    return JsonConvert.DeserializeObject<T>(data);
}

或者,如果你想在方法内部阻止,而不让消费者等待:

public T GetAsT<T> (HttpRequestMessage request)
{
    HttpResponseMessage apiCall = Client.SendAsync(request).Result;
    string data = apiCall.Content.ReadAsStringAsync().Result;
    return JsonConvert.DeserializeObject<T>(data);
}

我会做一些类似的事情

public static class HttpRequestMessageExtensions
{
    public static async Task<T> GetAsT<T>(this HttpRequestMessage request)
    {
        using (var client = new HttpClient())
        {
            var response = await client.SendAsync(request);
            return await response.Content.ReadAsAsync<T>();
        }
    }
}

并像一样使用它

var obj = new HttpRequestMessage(...).GetAsT<SomeCustomObject>();