2010-11-21 17 views
0

http://msdn.microsoft.com/en-us/library/system.data.datatable.clone.aspxによると「これらのクラスが派生した場合、そのクローンも同じ派生クラスになります。System.Data.DataTableが派生すると、DataTable.Cloneは派生クラスをどのように返しますか?

以下のサンプルコードでは、基本クラスのcloneメソッドが派生クラスを作成するためにどのように「知っていますか?たSystem.Data.DataTableがクローニングされ

public class MyDataTable : System.Data.DataTable 
     { 
      public override System.Data.DataTable Clone() 
      { 
       //How is this a MyDataTable not a "DataTable" ? 
       return base.Clone(); 
      } 
     } 

     static void Main(string[] args) 
     { 
      MyDataTable dt = new MyDataTable(); 
      System.Diagnostics.Debug.Assert(dt.Clone() is MyDataTable); 
     } 

答えて

1

あなたはリフレクター付きのDataTableのためのコードを掘る場合、あなたはプライベートクローン(データセット)メソッドによって呼び出され、この方法は、遭遇します:つまり

protected virtual DataTable CreateInstance() 
{ 
    return (DataTable) Activator.CreateInstance(base.GetType(), true); 
} 

を、それはあなたの新しいインスタンスを作成しますDataTableではなく、クラスです。このクローンには、典型的なDataTableプロパティの深いコピーがありますが、コンストラクタで追加したかもしれないが割り当てていないフィールドはデフォルト値を持つことに注意してください。

+0

私はそれがクールだと思っています - ありがとう! –

1

、それは最終的に、基礎となるデータテーブルタイプを構築するアクティベータークラスを使用して保護されたデータテーブル部材のCreateInstanceを呼び出します。

protected virtual DataTable CreateInstance() 
{ 
    return (DataTable) Activator.CreateInstance(base.GetType(), true); 
} 

ここで、GetTypeはMyDataTableへの実際の型参照を返します。基本クラスでGetTypeを呼び出しても、MyDataTableの実際のインスタンス型が返されることに注意してください。またノートとして、Activatorクラスは、手動でリフレクションを使用してConstructorInfoを参照してオブジェクトの新しいインスタンスを作成することなく、タイプデータに基づいて新しいオブジェクトを構築する簡単な方法です。

あなたが質問のこれらの種類に探してMSDN

素晴らしいプログラム上のアクティベータークラスの詳細情報を見つけることができReflectorが(それは無料です!)です。リフレクターを使用すると、アセンブリの内部を見て、実際に何が起こっているかを見ることができます。

関連する問題