包装任务以转换其返回值
本文关键字:返回值 转换 任务 包装 | 更新日期: 2023-09-27 18:24:57
HttpClient
的SendAsync
方法返回一个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>();