如何使用动态对象类型创建List

如何创建新的List ,其中T动态 Type对象。

我有

 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

跟进评论中的数据:

 var DyObjectsList = new List; 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中的所有对象都被最后分配的对象的值替换。

只需使用dynamic作为参数:

 var list = new List(); 

看起来你可能对.Add方法的工作原理有点困惑。 我将在解释中直接引用您的代码。

基本上在C#中,对象列表的.Add方法不会将新添加的对象复制到列表中,它只是将对象(它的地址)的引用复制到List中。 因此,列表中的每个值指向相同值的原因是因为您只创建了1个新的DyObj。 所以你的清单基本上就是这样的。

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

修复代码的最简单方法是为每个.Add创建一个新的DyObj。 使用.Add将新内部放在块中将在此特定实例中实现此目标。

 var DyObjectsList = new List; 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#中,如果在离开块时存在对新DyObjs的引用(并且由于.Add操作它们确实存在于List中),则C#不会释放与该指针关联的内存。 因此,您在该块中创建的对象仍然存在,并且您的List包含指向有效对象的指针,并且您的代码可以正常工作。