2013-05-07 52 views
5

基本上我做的是從異常轉換到GenericFaultException類(在下面的代碼段使用C#作爲一種語言。通用轉換

見下面詳細說明

FaultException<T>:FaultException(FaultException derived from exception) 

FaultException:Exception 

我已經使用所創建的一個faultExceptionObject下面的代碼行

public class ValidationFault: IValidationFault 
{ 
} 

FaultException<ValidationFault> faultExceptionObject=new FaultException<ValidationFault>(new ValidationFault()) 

我有沒有關於ValidationFault類的任何想法錯誤處理層,只有它知道IValidationFault。

public Exception HandleException(Exception exception, Guid handlingInstanceId) 
{  
    FaultException<IValidationFault> genericFaultException = exception as FaultException<IValidationFault>; 
    //********genericFaultException is always NULL********************** 
    IValidationFault fault = genericFaultException.Detail as IValidationFault; 
} 

出於某種原因,該行:

FaultException<IValidationFault> genericFaultException = exception as FaultException<IValidationFault>; 

結果genericFaultException 總是等於空,而是從快速監視我看到的例外是FaultException<ValidationFault>類型。我應該如何從Exception轉換爲FaultException<IValidationFault>

如果您需要更多信息,請讓我知道。

在此先感謝

+4

看起來像C#,但我不應該猜測。請添加適當的語言標籤。 – 2013-05-07 07:48:31

+1

這絕對是關於泛型。 – 2013-05-08 03:25:24

+0

@Tejas:是的,現在它確實是。但請閱讀V1;) – quetzalcoatl 2013-05-08 09:28:38

回答

3

exception as FaultException<IValidationFault>爲空的原因是因爲FaultException<ValidationFault>而不是 a FaultException<IValidationFault>

要使此操作按需要工作,必須編寫FaultException<T>,以便T是協變的。但是你不能在c#中爲類實現這一點。你必須使用一個接口。下面是應該工作的例子:

public interface IFaultException<out T> 
{ 
    T Detail { get; } 
} 

public class FaultException<T> : Exception, IFaultException<T> 
{ 
    private T _detail; 
    public T Detail { get { return _detail; } } 
    public FaultException(T detail, string message, Exception innerException) 
    : base(message, innerException) 
    { 
     _detail = detail; 
    } 
} 

有了這個類和接口,記在你的錯誤處理代碼,你應該能夠做到:

IFaultException<IValidationFault> genericFaultException = 
    exception as IFaultException<IValidationFault>; 

這是因爲你的異常(你知道真的是FaultException<ValidationFault>)執行IFaultException<ValidationFault>。由於IFaultException<T>對於T是協變的,這意味着任何IFaultException<ValidationFault>也可以用作IFaultException<IValidationFault>

+0

感謝布蘭登,這正是我期待的。 – 2013-05-08 06:03:58

+0

很酷。如果這確實回答了問題,請不要忘記接受答案。 – Brandon 2013-05-09 13:56:30

0

我認爲正常的方式是創建異常的新實例並設置其屬性(複製自FaultException異常),或使用異常內的構造函數,一個FaultException異常的說法,但這有點奇怪,因爲基類不應該知道它的子類。