2013-07-04 5 views
0

Рассмотрите случай, когда у вас есть различные классы, полученные из MyFaultBase. Поэтому, когда ваш веб-сервис должен указывать на ошибку, он выдает исключение типа FaultException<MySpecificFault>.Как проверить тип, используемый общим классом

После обнаружения этого исключения, как вы можете определить, привязан ли FaultException<T> к классу, полученному из MyFaultBase?

ответ

3

В глобальном пути:

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]); 
    } 
0

Насколько я могу судить, нет простого способа - проверить общий класс; вероятно, из-за гибкости общего параметра. Вот решение:

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 
    } 
} 
2

Вы можете получить аргументы универсального типа с использованием 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; 
} 
Смежные вопросы