2011-07-06 196 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包含指向有效对象的指针以及您的代码。

相关问题