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

C#如何不指定泛型参数即可判断异常是否为FailureException类型

解决方案

有两种常用的实现方案,都不需要在业务代码中额外声明泛型参数:

方案1:新增非泛型标记接口(更推荐,性能更高,扩展性强)

先定义一个空的非泛型标记接口,让你的泛型异常类实现该接口即可:

// 新增非泛型标记接口
public interface IFailureException { }

// 原有泛型异常类调整继承关系
public class FailureException<TRequest, TResponse> : PartialFailureException<TRequest, TResponse>, IFailureException
{
    public FailureException(TRequest request, TResponse response, TRequest requestToRetry)
        : base(request, response, requestToRetry) { }
}

之后类型判断逻辑可以直接简化为:

public static class ErrorDetector
{
    public static bool IsFailure(Exception e) => e is IFailureException;
}

如果后续需要提取所有FailureException的通用属性/方法,直接在IFailureException中声明即可,不需要调整泛型实现层。

方案2:直接判断泛型类型定义(无需修改现有异常类结构)

如果不想调整现有异常类的继承关系,可以直接在检测方法中判断异常的开放泛型类型是否匹配,不需要指定具体的泛型参数:

public static class ErrorDetector
{
    public static bool IsFailure(Exception e)
    {
        if (e == null) return false;
        var exceptionType = e.GetType();
        // 校验是否为泛型类型,且泛型定义和FailureException<,>一致
        return exceptionType.IsGenericType && 
               exceptionType.GetGenericTypeDefinition() == typeof(FailureException<,>);
    }
}

其中typeof(FailureException<,>)就是未填充泛型参数的开放类型,对应所有FailureException<TRequest, TResponse>的具体构造类型。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 04:09:01