1

以下の構造のような非ジェネリック クラスから継承するジェネリック クラスを用意します。

public class Result
{
     public string ErrorCode { get; set;}
     public string ErrorMessage { get; set;}
     public boo Success { get; set;}
     //Lots more properties

     public ClientResult ToClientResult()
     {
         //some pretty involved calculations of error coded and status
     }
 }

 public class Result<T> : Result
 {
     public T details {get; set;}

     public ClientResult<T> ToClientResult<T>()
     {
        //Need to call the parent class implementation and convert result to  generic ver  
     }
 }

私の質問は、親ToClientResult()を呼び出して結果を汎用バージョンに変換する方法です。次に、のプロパティをクラスの詳細プロパティにClientResult<T>設定する必要があります。ClientResult<T>Result<T>

ここで簡単な解決策が欠けていると確信しています。親クラスのロジックはかなり複雑なので、複製したくありません。

4

3 に答える 3

2

( を使用して) 親型として作成された場合、親型のオブジェクトを子型にキャストすることはできませんnew ClientResult()。それはそのようには機能しません。

Resultあなたができることは、クラスとクラスの両方で重労働を行うために使用する別のメソッドに複雑なコードを分解することですResult<T>:

public class Result
{
    public string ErrorCode { get; set;}
    public string ErrorMessage { get; set;}
    public boo Success { get; set;}
    //Lots more properties

     public ClientResult ToClientResult()
     {
         var clientResult = new ClientResult();
         SetupClientResult(clientResult);
         return clientResult;
     }

     protected void SetupClientResult(ClientResult clientResult) 
     {    
         //some pretty involved calculations of error coded and status           
     }

}

public class Result<T> : Result
{
     public T details {get; set;}

     // This now shadows the original ToClientResult method. The trap here is that if
     // you are treating your Result<T> instance as a Result, this method will not be 
     // called, and the return type will be ClientResult and not ClientResult<T>.
     // See: http://stackoverflow.com/questions/392721/difference-between-shadowing-and-overriding-in-c?lq=1
     public ClientResult<T> ToClientResult()
     {
         var clientResult = new ClientResult<T>();
         SetupClientResult(clientResult);

         clientResult.SomeProperty = details;

         return clientResult;
     }
}

ClientResult<T>これはすべてから派生したと仮定していますがClientResult、これはあなたの質問からはわかりにくいです。

于 2013-01-30T09:22:54.133 に答える
0

クラスではClientResult<T>、ClientResultからにカスタム変換を行うことができますClientResult<T>

public static explicit operator ClientReault<T>(ClientResult result)
{
       //do your conversion from one to the other here
}

次に、このようにToClientResultを記述できます。

 //Generic argument remove from method declaration
 //because it was shadowing the type argument
 public ClientResult<T> ToClientResult()
 {
    var clientResult = ((Result)this).ToClientResult()
    var genericResult = (ClientResult<T>)clientResult;
    //do what you need to do with the generically typed object
    //...
    return genericResult
 }

とはいえ、この状況は、継承チェーンに欠陥がある場合によく発生します。たとえば、isがない場合-基本クラスと派生クラスの関係

于 2013-01-30T09:32:18.663 に答える
0

明示的に変換を行う必要があります。

    public class ClientResult
    {
        public int a {get;set;}
    }

    public class ClientResult<T> : ClientResult
    {
        public ClientResult(ClientResult cr)
        {
            this.a = cr.a;
        }
    }

    public class Result<T> : Result
    {
        public T details { get; set; }

        public ClientResult<T> ToClientResult<T>()
        {
            var cr = base.ToClientResult();
            return new ClientResult<T>(cr);  
        }
    }

ClientResult に似たクラスがたくさんある場合は、AutoMapperのようなツールを使用できます。

于 2013-01-30T09:41:31.920 に答える