2010-11-21 15 views
0

http://msdn.microsoft.com/en-us/library/system.data.datatable.clone.aspx'a göre "Bu sınıflar türetilmişse, klon aynı türetilmiş sınıflardan de olacaktır".System.Data.DataTable türetildiğinde, DataTable.Clone türetilmiş sınıfı nasıl döndürür?

Aşağıdaki örnek kodda, temel sınıftaki klon yöntemi türetilmiş sınıfı oluşturmak için "nasıl" bilmektedir? Bir System.Data.DataTable klonlanır

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

cevap

1

, sen (DataSet) yöntemi özel Clone tarafından çağrılan bu yöntemi, karşılaşacağınız: Başka bir deyişle

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

, bu yeni bir örneğini oluşturur senin sınıf, DataTable değil. Dikkatli olun, bu klonun tipik DataTable özelliklerinin bir kopyası olacaktır, ancak eklemiş olabileceğiniz ancak yapıcınızda atamayacağınız tüm alanlar varsayılan değerlerine sahip olacaktır.

+0

Bu harika görüyorum - teşekkürler! –

1

, sonuçta altta yatan DataTable tür oluşturmak üzere aktivatör sınıfı kullanır korunan DataTable elemanı CreateInstance çağırır.

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

GetType, gerçek Type referansını MyDataTable'a döndürecektir. Alt sınıfta GetType aradığınız halde bile, MyDataTable'ın gerçek örnek türünü döndüreceğini unutmayın. Ayrıca bir not olarak, Activator sınıfı, bir nesnenin yeni bir örneğini oluşturmak için ConstructorInfo'yu aramak için yansımayı elle kullanmak zorunda kalmadan tip verilere dayanarak yeni nesneler oluşturmanın basit bir yoludur.

Çok soru bu tip bakarak için MSDN

Fantastik programı aktivatör sınıfına hakkında daha fazla bilgi bulabilirsiniz Reflector (ücretsiz!) 'Dir. Reflektör, gerçekte neler olduğunu görmek için herhangi bir derlemenin iç kısmına bakmanızı sağlar. Eğer Reflektör DataTable için kod üzerinden kazmak ise

İlgili konular