Basically I'm doing is converting from Exception to GenericFaultException class (The below code snippet uses C# as a language.
See the below details
FaultException<T>:FaultException(FaultException derived from exception)
FaultException:Exception
I have created a faultExceptionObject using the below line of code
public class ValidationFault: IValidationFault
{
}
FaultException<ValidationFault> faultExceptionObject=new FaultException<ValidationFault>(new ValidationFault())
I have a Error handling layer which do not have any idea about ValidationFault class,only it knows 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;
}
For some reason the line:
FaultException<IValidationFault> genericFaultException = exception as FaultException<IValidationFault>;
results in genericFaultException always equal to null, but from the QuickWatch I see Exception is of type FaultException<ValidationFault>
. How should I convert from Exception
to FaultException<IValidationFault>
?
Please let me know if you need any more information.
Thanks in advance
The reason exception as FaultException<IValidationFault>
is null is because a FaultException<ValidationFault>
is not a FaultException<IValidationFault>
.
For this operation to work as you want, FaultException<T>
must be written so that T
is covariant. But you cannot do that in c# for classes. You have to use an interface. Here is an example that should work:
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;
}
}
With this class and interface, down in your error handling code you should be able to do:
IFaultException<IValidationFault> genericFaultException =
exception as IFaultException<IValidationFault>;
This is because your exception (which you know is really a FaultException<ValidationFault>
) implements IFaultException<ValidationFault>
. Since IFaultException<T>
is covariant for T
, this means any IFaultException<ValidationFault>
can also be used as IFaultException<IValidationFault>
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With