通用转换

IT *_*her 5 c# generics covariance

基本上我正在做的是从Exception转换为GenericFaultException类(下面的代码片段使用C#作为语言.

请参阅以下详细信息

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

FaultException:Exception
Run Code Online (Sandbox Code Playgroud)

我使用下面的代码行创建了一个faultExceptionObject

public class ValidationFault: IValidationFault
{
}

FaultException<ValidationFault> faultExceptionObject=new FaultException<ValidationFault>(new ValidationFault())
Run Code Online (Sandbox Code Playgroud)

我有一个错误处理层,它对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;
 }
Run Code Online (Sandbox Code Playgroud)

由于某种原因,该行:

FaultException<IValidationFault> genericFaultException = exception as FaultException<IValidationFault>;  
Run Code Online (Sandbox Code Playgroud)

genericFaultException的结果总是等于null,但是从QuickWatch我看到Exception是类型的FaultException<ValidationFault>.我该如何转换ExceptionFaultException<IValidationFault>

如果您需要更多信息,请与我们联系.

提前致谢

Bra*_*don 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

有了这个类和接口,在错误处理代码中您应该能够执行以下操作:

IFaultException<IValidationFault> genericFaultException =
    exception as IFaultException<IValidationFault>;
Run Code Online (Sandbox Code Playgroud)

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