我有一个通用方法SendHttpRequest<TRequest, TResponse>,它接受请求类型和响应类型作为其通用参数输入。响应类型可以是布尔值或表示响应的类。
我的任务是返回true方法内发出的 HTTP 请求是否成功并且TResponse是bool. 如果TResponse是不同类型,我需要将响应内容反序列化为TResponse对象。返回true会产生编译时错误。有没有办法让单个方法同时支持布尔和非布尔返回类型?
private async Task<TResponse> SendHttpRequest<TRequest, TResponse>(TRequest request)
{
using (var client = new HttpClient())
{
client.BaseAddress = "http://example.com/";
var response = await client.PostAsJsonAsync("api_path", request).ConfigureAwait(false);
if (!response.IsSuccessStatusCode)
{
throw new MyException(response);
}
if (typeof (TResponse) == typeof (bool))
{
return true; // Generates compile-time error
}
else
{
var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
return JsonConvert.DeserializeObject<TResponse>(content);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想你已经明白这是一个糟糕的设计,但如果你真的想让它完全像这样,你可以这样做:
private async Task<TResponse> SendHttpRequest<TRequest, TResponse>(TRequest request)
{
using (var client = new HttpClient())
{
client.BaseAddress = "http://example.com/";
var response = await client.PostAsJsonAsync("api_path", request).ConfigureAwait(false);
if (!response.IsSuccessStatusCode)
{
throw new MyException(response);
}
if (typeof (TResponse) == typeof (bool))
{
return (TResponse)(object)true;
}
else
{
var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
return JsonConvert.DeserializeObject<TResponse>(content);
}
}
}
Run Code Online (Sandbox Code Playgroud)