Domanda

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;

Quando eseguo questo, posso vedere i dati all'interno del modello, ma non listOfx.

Problema: come ottenere una lista (o IEnumerable) all'interno di un ExpandoObject

UPDATE sulla Soluzione: entrare descrizione dell'immagine qui

Perché non ho potuto vedere la lifOfx nella finestra di gente del posto ho pensato che non funzionava. Qui (attraverso y) si può vedere che è. : -)

È stato utile?

Soluzione

I non può riprodurre problemi simili su 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

sarò ripetere il test su finestre a breve.

Aggiorna hanno verificato le seguenti:

  • i linux-compilato (dmcs) run binario su Windows con Mono 2.10: OK
  • i linux-compilato (dmcs) run binario su Windows con MS.NET 4.0: OK
  • le finestre-compilati (DMC) gira binario su Windows con Mono 2.10: OK
  • le finestre-compilati (DMC) gira binario su Windows con MS.NET 4.0: OK
  • Windows-compilati (Csc.exe) run binario su Windows con Mono 2.10: OK
  • Windows-compilati (Csc.exe) run binario su Windows con MS.NET 4.0: OK

Su Linux Ho testato solo il binario compilato da mono sé, ma non prevedo alcun problema. Forse c'è qualcosa di leggermente diverso su come conservare le dinamiche all'interno della List <>, mi test che ora

Altri suggerimenti

Il codice che hai, soprattutto, funziona perfettamente per la creazione della lista. Ad esempio, l'aggiunta di questo dopo il codice funziona bene:

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

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

Ad esempio, provare la seguente (esempio perfettamente funzionante):

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

Questo utilizza il codice esatto del campione.

L'ExpandoObject supporta IDictionary. È possibile lanciarlo come

IDictionary myModel =(IDictionary)Model;

Quindi, allora si può iterare esso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top