2010-11-21 1 views
0

Nach http://msdn.microsoft.com/en-us/library/system.data.datatable.clone.aspx "Wenn diese Klassen abgeleitet wurden, wird der Klon auch die gleichen abgeleiteten Klassen sein".Wenn System.Data.DataTable abgeleitet wird, wie gibt DataTable.Clone die abgeleitete Klasse zurück?

In dem folgenden Beispielcode wie "weiß" die Klonmethode für die Basisklasse, die abgeleitete Klasse zu erstellen?

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); 
     } 

Antwort

1

Wenn Sie den Code für Datatable mit Reflektor graben, Sie diese Methode würden begegnen, von der privaten Clone (DataSet) -Methode aufgerufen:

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

Mit anderen Worten, erstellt es eine neue Instanz des Klasse, nicht DataTable. Seien Sie vorsichtig, dieser Klon wird eine tiefe Kopie der typischen DataTable-Eigenschaften haben, aber alle Felder, die Sie vielleicht hinzugefügt haben, aber nicht in Ihrem Konstruktor zuweisen, werden ihre Standardwerte haben.

+0

Ich sehe das ist cool - danke! –

1

Wenn ein System.Data.DataTable geklont wird, ruft sie die geschützte Datentabelle Mitglied CreateInstance die letztendlich die Activator-Klasse verwendet, die zugrundeliegende Datentabelle Typ zu konstruieren.

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

Wo GetType die tatsächliche Typverweis auf MyDataTable zurückgeben wird. Denken Sie daran, dass selbst dann, wenn Sie GetType in der Basisklasse aufrufen, der tatsächliche Instanztyp von MyDataTable zurückgegeben wird. Außerdem ist die Activator-Klasse ein einfacher Weg, um neue Objekte auf der Basis von Typendaten zu konstruieren, ohne die Reflection manuell verwenden zu müssen, um die ConstructorInfo nach einer neuen Instanz eines Objekts zu durchsuchen.

Sie können auf diese Art von Fragen suchen sie in auf MSDN

Ein fantastisches Programm mehr Informationen über die Activator-Klasse zu finden ist Reflector (es ist kostenlos!). Mit Reflector können Sie die Interna jeder Baugruppe betrachten, um zu sehen, was tatsächlich passiert.

Verwandte Themen