c# – 通用转换
基本上我正在做的是从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>.我应该如何从Exception转换为FaultException< IValidationFault>? 如果您需要更多信息,请与我们联系. 提前致谢 解决方法
作为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; } } 使用此类和接口,您可以在错误处理代码中执行以下操作: IFaultException<IValidationFault> genericFaultException = exception as IFaultException<IValidationFault>; 这是因为您的异常(您知道它实际上是一个FaultException< ValidationFault>)实现了IFaultException< ValidationFault>.由于IFaultException< T>对于T是协变的,这意味着任何IFaultException< ValidationFault>也可以用作IFaultException< IValidationFault>. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |