2010-11-21 107 views
0

根據http://msdn.microsoft.com/en-us/library/system.data.datatable.clone.aspx「如果已經派生了這些類,則該克隆也將具有相同的派生類」。當派生System.Data.DataTable時,DataTable.Clone如何返回派生類?

在下面的示例代碼中,如何在基類的「克隆」方法創建派生類?

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

我看到這很酷 - 謝謝! – 2010-11-21 19:25:56

1

當System.Data.DataTable被克隆,它調用最終使用Activator類構建基礎DataTable類型被保護的DataTable構件的CreateInstance。

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

其中,GetType將實際的Type引用返回給MyDataTable。請記住,即使通過在基類中調用GetType,它也會返回實際的MyDataTable實例類型。同樣值得注意的是,Activator類是基於類型數據構造新對象的簡化方法,無需手動使用反射來查找ConstructorInfo來創建對象的新實例。

您可以找到Activator類上MSDN

一個夢幻般的程序的詳細信息,在尋找到這些類型的問題是Reflector(它是免費的!)。 Reflector允許您查看任何程序集的內部,以查看實際發生的情況。