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 is of type が表示されますFaultException<ValidationFault>Exceptionからに変換するにはどうすればよいFaultException<IValidationFault>ですか?

さらに情報が必要な場合はお知らせください。

前もって感謝します

4

2 に答える 2

3

exception as FaultException<IValidationFault>nullの理由は、 a が aFaultException<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これは anyIFaultException<ValidationFault>を としても使用できることを意味しIFaultException<IValidationFault>ます。

于 2013-05-08T03:24:14.483 に答える