从布尔返回类型的泛型方法返回一个布尔值

本文关键字:一个 布尔值 返回 布尔 返回类型 泛型方法 | 更新日期: 2023-09-27 18:06:49

我有一个通用方法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);
        }
    }
}

从布尔返回类型的泛型方法返回一个布尔值

我想你已经明白这是一个糟糕的设计,但如果你真的想让它完全像这样,你可以这样做:

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);
        }
    }
}