5

基本上我正在做的是从 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 我看到 Exception 是类型FaultException<ValidationFault>。我应该如何从 转换ExceptionFaultException<IValidationFault>

如果您需要更多信息,请告诉我。

提前致谢

4

2 回答 2

3

原因exception as FaultException<IValidationFault>是 null 是因为aFaultException<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>;

这是因为您的异常(您知道它实际上是 a FaultException<ValidationFault>)实现了IFaultException<ValidationFault>. 由于IFaultException<T>是 协变的T,这意味着 anyIFaultException<ValidationFault>也可以用作IFaultException<IValidationFault>

于 2013-05-08T03:24:14.483 回答
0

我认为正常的方法是创建一个新的 Exception 实例并设置它的属性(从 FaultException 复制),或者在 Exception 中使用一个以 FaultException 作为参数的构造函数,但这会有点奇怪,因为基类不应该有关于其子类的知识。

于 2013-05-07T07:49:52.480 回答