基本上我正在做的是从 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 始终等于 null,但从 QuickWatch 中我看到异常的类型为 FaultException<ValidationFault>
.我应该如何从 Exception
转换至 FaultException<IValidationFault>
?
如果您需要更多信息,请告诉我。
提前致谢
最佳答案
原因exception as FaultException<IValidationFault>
为空是因为 FaultException<ValidationFault>
不是 FaultException<IValidationFault>
.
要使此操作按照您的意愿进行,FaultException<T>
必须写成 T
是协变的。但是你不能在 c# 中为类做到这一点。你必须使用一个接口(interface)。这是一个应该有效的示例:
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/