2012-11-29 11 views
0

下面的例子顯示了意圖。這個例子遍歷一個對象數組,並創建一個具有相同類型的數組並載入默認值。這些值本身不需要從一個列表複製到下一個列表。這是列表中的「類型克隆」。如何創建存儲在對象變量中的對象的新默認實例?

下面的代碼產生用於激活以下錯誤:

「 System.Int32不是GenericTypeDefinition MakeGenericType可以僅在一個類型爲哪些Type.IsGenericTypeDefinition是真的被稱爲」。

Activator,CreateInstance和MakeGenericType的細節仍然讓我感到困惑。

如何更改代碼以避免錯誤?

任何建議,將不勝感激。

private void Test() 
    { 
     object[] a = new object[] {100, "Text", new clsMyClass()}; 
     object[] b = new object[a.Length]; 

     for (int i = 0; i < a.Length; i++) 
     { 
      b[i] = Activator.CreateInstance(a[i].GetType().MakeGenericType()); 
     } 

     for (int i = 0; i < b.Length; i++) 
     { 
      Console.WriteLine(b[i].GetType().ToString()); 
     } 
    } 

預期輸出將是:

  • System.Int32
  • System.String
  • MyNamespace.clsMyClass

將所得的值將是:

  • B [0] = 0
  • B [1] = 「」
  • B [2] =新clsMyClass

回答

3

除去MakeGenericType(),它會開始工作時,使用該

b[i] = Activator.CreateInstance(a[i].GetType()); 

MakeGenericType用於將泛型參數替換爲定義的參數。 例如,如果您的陣列將包含List<T>,則調用a[i].GetType().MakeGenericType(typeof(int))將返回類型List<int>

在你的情況我沒有看到任何泛型類型,所以我不知道爲什麼你使用它

還要注意,調用Activator.CreateInstance像這樣將工作只有類型有參數的構造函數,這是不正確的,例如在案件string。您可以處理string情況下,這樣的

for (int i = 0; i < a.Length; i++) 
{ 
    var oType = a[i].GetType(); 
    if (oType == typeof(string)) 
     b[i] = string.Empty; //or may be null 
    else 
     b[i] = Activator.CreateInstance(oType); 
} 

東西simular應該爲所有類型的情況,沒有參數的構造函數。 Activator.CreateInstance(type, parameters...)可以完成這項工作。 你可以使用反射調查類型構造參數如果需要

+0

是的,當然,這是另一個問題:) –

+0

+但不會工作,因爲'string'沒有無參數的構造函數。 http://stackoverflow.com/a/2092912/284240 –

+0

你是對的人,非常感謝,我編輯帖子 –

相關問題