2011-07-06 133 views
22

如何創建一個新的List<T>,其中牛逼動態類型的對象。如何創建一個列表與動態對象類型

dynamic DyObj = new ExpandoObject(); 

if (condition1) 
{ 
    DyObj.Required = true; 
    DyObj.Message = "This is the first property being accessed through dynamic object"; 
} 
if (condition2) 
{ 
    DyObj.Required = false; 
    DyObj.Message = "This is the second property...."; 
} 
// and so on... 

我想創建List<Dyobj>和分配基於條件的所有消息Dyobj

從評論跟進數據:

var DyObjectsList = new List<dynamic>; 
dynamic DyObj = new ExpandoObject(); 
if (condition1) { 
    DyObj.Required = true; 
    DyObj.Message = "Message 1"; 
    DyObjectsList.Add(DyObj); 
} 
if (condition2) { 
    DyObj.Required = false; 
    DyObj.Message = "Message 2"; 
    DyObjectsList.Add(DyObj); 
} 

有趣的是在DyObjectsList所有的對象都與最後分配的對象的值替換。

回答

41

只需使用dynamic作爲參數:

var list = new List<dynamic>(); 
+0

@Krik謝謝。這是我做的。 var DyObjectsList =新列表;動態DyObj = new ExpandoObject(); if(condition1){DyObj.Required = true; DyObj.Message =「Message 1」; DyObjectsList .Add(DyObj); } if(condition2){DyObj.Required = false; DyObj.Message =「Message 2」; DyObjectsList .Add(DyObj); }有趣的是,DyObjectsList中的所有對象都被替換爲最後分配的對象的值。 – BumbleBee

+3

@BumbleBee,這是因爲你正在覆蓋你的對象的值。你實例化你的DyObj的一個**實例,並繼續爲同一個實例賦值兩次。你應該在你的if塊中移動'dynamic DyObj = new ExpandoObject();'這個行,並且你最終應該得到這行的兩個副本,因爲你想添加兩個單獨的實例。 –

4

看樣子你可能會有點困惑,該方法。新增如何工作的。我會在我的解釋中直接提到你的代碼。

基本上在C#中,對象列表的.Add方法不會將新添加的對象複製到列表中,它僅僅將對象(它的地址)的引用複製到列表中。因此,列表中的每個值指向相同的值的原因是因爲您只創建了1個新的DyObj。所以你的清單看起來像這樣。

DyObjectsList[0] = &DyObj; // pointing to DyObj 
DyObjectsList[1] = &DyObj; // pointing to the same DyObj 
DyObjectsList[2] = &DyObj; // pointing to the same DyObj 

...

解決您的代碼最簡單的方法是創建每一個。新增新DyObj。使用.Add添加塊的新內容可以在此特定情況下實現此目標。

var DyObjectsList = new List<dynamic>; 
if (condition1) { 
    dynamic DyObj = new ExpandoObject(); 
    DyObj.Required = true; 
    DyObj.Message = "Message 1"; 
    DyObjectsList .Add(DyObj); 
} 
if (condition2) { 
    dynamic DyObj = new ExpandoObject(); 
    DyObj.Required = false; 
    DyObj.Message = "Message 2"; 
    DyObjectsList .Add(DyObj); 
} 

您的結果列表基本上是這樣的

DyObjectsList[0] = &DyObj0; // pointing to a DyObj 
DyObjectsList[1] = &DyObj1; // pointing to a different DyObj 
DyObjectsList[2] = &DyObj2; // pointing to another DyObj 

現在,在其他一些語言這種方法是行不通的,因爲當你離開塊,塊的範圍內聲明的對象可能超出範圍並被銷燬。因此,你將剩下一堆指向垃圾的指針。但是在C#中,如果在離開塊時存在對新DyObj的引用(並且由於.Add操作它們存在於List中),那麼C#不會釋放與該指針關聯的內存。因此,您在該塊中創建的對象會持續存在,並且您的List包含指向有效對象的指針以及您的代碼。

相關問題