You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中如何检查泛型方法PostAsync的TResponse类型参数?

检查TResponse的类型与null状态

1. 判断TResponse是否为特定类型

静态类型判断(无需实例)

直接通过typeof(TResponse)与目标类型对比,适合在方法执行初期判断类型:

public async Task<TResponse> PostAsync<TRequest, TResponse>(string url, TRequest data)
{
    // 精准匹配类型
    if (typeof(TResponse) == typeof(UserDto))
    {
        // 针对UserDto类型的前置逻辑
    }

    // 判断是否为目标类型的子类/实现类
    if (typeof(IResponse).IsAssignableFrom(typeof(TResponse)))
    {
        // 处理所有实现IResponse接口的类型
    }

    // 实际API调用逻辑
}

实例类型判断(获取返回值后)

拿到API返回的实例后,用is运算符直接判断并转换,方便后续使用:

public async Task<TResponse> PostAsync<TRequest, TResponse>(string url, TRequest data)
{
    TResponse response = await MakeApiCall(url, data); // 实际API调用方法

    // 判断实例类型并直接赋值给变量
    if (response is ErrorResponse errorResp)
    {
        // 直接使用errorResp处理错误
        LogError(errorResp.ErrorCode, errorResp.Message);
    }

    return response;
}

2. 判断TResponse实例是否为null

需要区分引用类型和值类型的差异:引用类型可null,普通值类型不可null(可空值类型T?除外)。

通用默认值判断

兼容所有类型,判断实例是否等于该类型的默认值(引用类型为null,值类型为0、false等):

public async Task<TResponse> PostAsync<TRequest, TResponse>(string url, TRequest data)
{
    TResponse response = await MakeApiCall(url, data);

    if (EqualityComparer<TResponse>.Default.Equals(response, default))
    {
        // 处理默认值场景
    }

    return response;
}

仅判断引用类型的null

先过滤出引用类型,再判断null:

public async Task<TResponse> PostAsync<TRequest, TResponse>(string url, TRequest data)
{
    TResponse response = await MakeApiCall(url, data);

    if (typeof(TResponse).IsClass && response == null)
    {
        // 仅处理引用类型的null情况
        throw new InvalidOperationException("API返回空结果");
    }

    return response;
}

3. 综合场景示例

比如在API返回后,先判断是否为错误类型,再检查null:

public async Task<TResponse> PostAsync<TRequest, TResponse>(string url, TRequest data)
{
    var httpResponse = await HttpClient.PostAsJsonAsync(url, data);
    TResponse response = await httpResponse.Content.ReadFromJsonAsync<TResponse>();

    // 处理错误类型
    if (response is ErrorResponse error)
    {
        throw new ApiCallException(error.Code, error.Message);
    }

    // 处理引用类型null
    if (typeof(TResponse).IsClass && response == null)
    {
        throw new NullResultException("API未返回有效数据");
    }

    return response;
}

内容的提问来源于stack exchange,提问作者Sam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 13:10:46