2013-05-07 12 views
5

Grundsätzlich von Exception wird die Umstellung auf GenericFaultException Klasse ich tue (Der folgende Code-Schnipsel verwendet C# als Sprache.Generisches Umwandlung

unten Details

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

FaultException:Exception 

ich eine faultExceptionObject erstellt habe die Verwendung von unter Codezeile

public class ValidationFault: IValidationFault 
{ 
} 

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

ich habe eine Fehlerbehandlung Schicht, die nur keine Ahnung von ValidationFault Klasse, es weiß 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; 
} 

Aus irgendeinem Grund die Zeile:

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

Ergebnisse in genericFaultException immer gleich auf null, sondern aus der Schnellüberwachung sehe ich Ausnahme vom Typ ist FaultException<ValidationFault>. Wie soll ich von Exception zu FaultException<IValidationFault> konvertieren?

Bitte lassen Sie mich wissen, wenn Sie weitere Informationen benötigen.

Vielen Dank im Voraus

+4

Sieht aus wie C#, aber ich sollte nicht raten müssen. Bitte fügen Sie ein passendes Sprachtag hinzu. –

+1

Es geht definitiv um Generika. –

+0

@ Tejas: Ja, jetzt ist es tatsächlich. Aber bitte lesen Sie die V1;) – quetzalcoatl

Antwort

3

Der Grund exception as FaultException<IValidationFault> null ist, weil ein FaultException<ValidationFault>nicht ein FaultException<IValidationFault> ist.

Damit dieser Vorgang wie gewünscht funktioniert, muss FaultException<T> so geschrieben werden, dass T kovariant ist. Aber das kannst du in C# nicht für Klassen tun. Sie müssen eine Schnittstelle verwenden. Hier ist ein Beispiel, die funktionieren sollen:

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

Mit dieser Klasse und Schnittstelle nach unten in Ihrem Fehlerbehandlungscode sollten Sie tun können:

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

Dies liegt daran, Ihre Ausnahme (die Sie kennen ist wirklich ein FaultException<ValidationFault>) implementiert IFaultException<ValidationFault>. Da IFaultException<T> für T kovariant ist, bedeutet dies, dass IFaultException<ValidationFault> auch als IFaultException<IValidationFault> verwendet werden kann.

+0

Vielen Dank Brandon, das ist, was ich erwartet hatte. –

+0

Kühl. Vergessen Sie nicht, die Antwort zu akzeptieren, wenn dies tatsächlich die Frage beantwortet. – Brandon

0

Ich denke, die normale Art und Weise eine neue Instanz der Exception zu erstellen und ihre Eigenschaften (Kopieren von FaultException) oder einen Konstruktor innerhalb Ausnahme verwenden, die einen FaultException als Argument verwendet, aber dies würde ein bisschen seltsam, weil eine Basisklasse kein Wissen über ihre Unterklasse (n) haben sollte.