How to create a List with a dynamic object type

后端 未结 2 805
傲寒
傲寒 2020-12-09 01:47

How can I create a new List where the T is a dynamic Type object.

I have



        
相关标签:
2条回答
  • 2020-12-09 02:08

    Just use dynamic as the argument:

    var list = new List<dynamic>();
    
    0 讨论(0)
  • 2020-12-09 02:26

    It appears you might be a bit confused as to how the .Add method works. I will refer directly to your code in my explanation.

    Basically in C#, the .Add method of a List of objects does not COPY new added objects into the list, it merely copies a reference to the object (it's address) into the List. So the reason every value in the list is pointing to the same value is because you've only created 1 new DyObj. So your list essentially looks like this.

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

    ...

    The easiest way to fix your code is to create a new DyObj for every .Add. Putting the new inside of the block with the .Add would accomplish this goal in this particular instance.

    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); 
    } 
    

    your resulting List essentially looks like this

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

    Now in some other languages this approach wouldn't work, because as you leave the block, the objects declared in the scope of the block could go out of scope and be destroyed. Thus you would be left with a collection of pointers, pointing to garbage.

    However in C#, if a reference to the new DyObjs exists when you leave the block (and they do exist in your List because of the .Add operation) then C# does not release the memory associated with that pointer. Therefore the Objects you created in that block persist and your List contains pointers to valid objects and your code works.

    0 讨论(0)
提交回复
热议问题