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

Bum*_*Bee 28 c# list dynamic object

如何List<T>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...
Run Code Online (Sandbox Code Playgroud)

我想根据条件创建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); 
} 
Run Code Online (Sandbox Code Playgroud)

有趣的是,DyObjectsList中的所有对象都被最后分配的对象的值替换.

Kir*_*oll 58

只需dynamic用作参数:

var list = new List<dynamic>();
Run Code Online (Sandbox Code Playgroud)

  • @BumbleBee,这是因为你要覆盖对象的值.你实例化你的`DyObj`的一个**实例,然后继续为同一个实例*赋值两次*.你应该在if块中移动`dynamic DyObj = new ExpandoObject();`,你应该最后得到该行的两个副本,因为你想要添加两个单独的实例. (3认同)

Dan*_*rne 5

看起来你可能对.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
Run Code Online (Sandbox Code Playgroud)

...

修复代码的最简单方法是为每个.Add创建一个新的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); 
} 
Run Code Online (Sandbox Code Playgroud)

你的结果列表基本上是这样的

DyObjectsList[0] = &DyObj0; // pointing to a DyObj
DyObjectsList[1] = &DyObj1; // pointing to a different DyObj
DyObjectsList[2] = &DyObj2; // pointing to another DyObj
Run Code Online (Sandbox Code Playgroud)

现在在其他一些语言中,这种方法不起作用,因为当你离开块时,在块范围内声明的对象可能超出范围并被销毁.因此,你将留下指向垃圾的指针集合.

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