c# - 通用转换

标签 c# generics covariance

基本上我正在做的是从 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/

相关文章:

c# - 带有 Caliburn.micro 的动态 DataGrid 列

java - 内部类的通用数组创建编译错误

r - 在R中寻找逆矩阵

c# - List.OfType<> 的性能影响是什么,其中整个列表都是该类型?

OOP:实现具有更广泛签名的接口(interface)方法

Java 8 Lambdas - 相当于 c# OfType

c# - 以编程方式调用 WinForms contextmenustrip

c# - 制作通用方法来更新 Entity Framework 多对多导航属性

c# - 使用泛型进行多重调度

c# - 没有 OrderedDictionary 的通用实现?