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
相关产品推荐
相关产品推荐

