A List inside an ExpandoObject
Asked Answered
P

3

5
dynamic model = new ExpandoObject();
model.Data = "asdf";

List<dynamic> listOfx = new List<dynamic>();
for (int i = 0; i < 3; i++) {
    dynamic x = new ExpandoObject();
    x.ID = i;
    x.Name = "test" + i.ToString();
    listOfx.Add(x);
}
model.listOfx = listOfx;

When I run this, I can see Data inside model, but not listOfx.

Problem: how to get a list(or IEnumerable) inside an ExpandoObject

UPDATE on Solution: enter image description here

Because I couldn't see the lifOfx in the locals window I thought it wasn't working. Here (through y) you can see it is. :-)

Premiere answered 19/10, 2011 at 22:25 Comment(0)
C
4

I can't reproduce similar issues on Mono 2.10:

using System.Dynamic;
using System.Collections.Generic;

using System;

public class Program
{
    public static void Main(string[] args)
    {
        dynamic x = new ExpandoObject();
        x.Data ="test";
        x.Arr = new [] { "test1","test2"};
        x.Lst = new List<string> { "aap", "noot", "mies" };

        Console.WriteLine(string.Join(", ", x.Arr));
        Console.WriteLine(string.Join(", ", x.Lst));
    }
}

Output:

/tmp @ dmcs test.cs && mono test.exe
test1, test2
aap, noot, mies

I'll be retesting on windows shortly.

Update have tested the following:

  • the linux-compiled (dmcs) binary run on Windows with Mono 2.10: OK
  • the linux-compiled (dmcs) binary run on Windows with MS.NET 4.0: OK
  • the windows-compiled (dmcs) binary run on Windows with Mono 2.10: OK
  • the windows-compiled (dmcs) binary run on Windows with MS.NET 4.0: OK
  • the windows-compiled (csc.exe) binary run on Windows with Mono 2.10: OK
  • the windows-compiled (csc.exe) binary run on Windows with MS.NET 4.0: OK

On linux I have only tested the binary compiled by mono itself, but I don't anticipate any problems. Perhaps there is something subtly different about storing dynamics inside the List<>, I'll test that now

Czardas answered 19/10, 2011 at 22:42 Comment(1)
Many thanks @Czardas - in fact it is my own fault... thought it wasn't working due to not being able to see in locals window. But it is!Premiere
C
4

The code you have, above, works perfectly well for setting up the list. For example, adding this after your code will work fine:

// Access value inside list
Console.WriteLine(model.listOfx[1].Name);

// Iterate through list
foreach (var o in model.listOfx)
{
    Console.WriteLine(o.ID);
}

For example, try the following (fully functional example):

using System;
using System.Collections.Generic;
using System.Dynamic;
using System.Linq;

public static class Test
{

    public static void Main()
    {
        dynamic model = new ExpandoObject();
        model.Data = "asdf";

        List<dynamic> listOfx = new List<dynamic>();
        for (int i = 0; i < 3; i++)
        {
            dynamic x = new ExpandoObject();
            x.ID = i;
            x.Name = "test" + i.ToString();
            listOfx.Add(x);
        }
        model.listOfx = listOfx;

        // Access value inside list
        Console.WriteLine(model.listOfx[1].Name);

        // Iterate through list
        foreach (var o in model.listOfx)
        {
            Console.WriteLine(o.ID);
        }

        Console.ReadKey();
    }
}

This uses your exact sample code.

Chiekochien answered 19/10, 2011 at 22:42 Comment(1)
I think you mean foreach (var o in model.listOfx) (twice)?Czardas
J
0

The ExpandoObject supports IDictionary. You can cast it such as

IDictionary myModel =(IDictionary)Model;

So then you can iterate it.

Jamiejamieson answered 19/10, 2011 at 22:41 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.