如何检查泛型类使用的类型

本文关键字:类型 泛型类 何检查 检查 | 更新日期: 2023-09-27 18:21:15

考虑从MyFaultBase派生出各种类的情况。因此,当您的web服务需要指示故障时,它会抛出类型为FaultException<MySpecificFault>的异常。

捕获此异常后,如何确定FaultException<T>是否绑定到从MyFaultBase派生的类?

如何检查泛型类使用的类型

以全局方式:

    public class SpecificClass : BaseClass
    {
    }
    public class BaseClass
    {
    }
    public class TemplatedClass<T>
    {
    }
    static void Main(string[] args)
    {
        var templateInstance = new TemplatedClass<SpecificClass>();
        var @true = typeof (BaseClass).IsAssignableFrom(templateInstance.GetType().GetGenericArguments()[0]);
        var templateInstance2 = new TemplatedClass<int>();
        var @false = typeof (BaseClass).IsAssignableFrom(templateInstance2.GetType().GetGenericArguments()[0]);
    }

您可以使用Type.GetGenericArguments()获取泛型类型参数。

那么你的IsExceptionBoundToType方法可能看起来像这样:

public static bool IsExceptionBoundToType(FaultException fe, Type checkType)
{
    bool isBound = false;
    Type feType = fe.GetType();
    if (feType.IsGenericType && feType.GetGenericTypeDefinition() == typeof(FaultException<>))
    {
        Type faultType = feType.GetGenericArguments()[0];
        isBound = checkType.IsAssignableFrom(faultType);
    }
    return isBound;
}

据我所知,没有简单的方法可以检查泛型类;可能是由于通用参数的灵活性。这里有一个解决方案:

public static bool IsExceptionBoundToType(FaultException fe, Type checkType)
{
   bool isBound = false;
   // Check to see if the FaultException is a generic type.
   Type feType = fe.GetType();
   if (feType.IsGenericType && feType.GetGenericTypeDefinition() == typeof(FaultException<>))
   {
      // Check to see if the Detail property is a class of the specified type.
      PropertyInfo detailProperty = feType.GetProperty("Detail");
      if (detailProperty != null)
      {
         object detail = detailProperty.GetValue(fe, null);
         isBound = checkType.IsAssignableFrom(detail.GetType());
      }
   }
   return (isBound);
}

捕获异常并检查如下:

catch (Exception ex)
{
   if ((ex is FaultException) && IsExceptionBoundToType(ex, typeof(MyFaultBase)))
   {
      // do something
   }
}