基本上我正在做的是从Exception转换为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 始终等于空,但是从QuickWatch中我看到Exception的类型为
FaultException<ValidationFault>
。我应该如何从Exception
转换为FaultException<IValidationFault>
?如果您需要更多信息,请告诉我。
提前致谢
最佳答案
exception as FaultException<IValidationFault>
为null的原因是因为FaultException<ValidationFault>
不是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;
}
}
使用此类和接口(interface),在错误处理代码中,您应该能够执行以下操作:
IFaultException<IValidationFault> genericFaultException =
exception as IFaultException<IValidationFault>;
这是因为您的异常(您知道这实际上是
FaultException<ValidationFault>
)实现了IFaultException<ValidationFault>
。由于IFaultException<T>
是T
的协变变量,因此这意味着任何IFaultException<ValidationFault>
也可以用作IFaultException<IValidationFault>
。关于c# - 通用转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16413830/