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

