Una lista all'interno di un ExpandoObject
-
27-10-2019 - |
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:
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 è. : -)
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.