2011-10-19 11 views
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; 

Cuando ejecuto esto, puedo ver Datos dentro del modelo, pero no listOfx.Una lista dentro de un ExpandoObject

problema: cómo obtener una lista (o IEnumerable) dentro de un ExpandoObject

UPDATE en Solución: enter image description here

Porque no podía ver el lifOfx en la ventana locales pensé que no era trabajando. Aquí (a través de y) puedes ver que es. :-)

Respuesta

3

No puedo reproducir problemas similares en 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)); 
    } 
} 

Salida:

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

voy a volver a probar en las ventanas en breve.

actualización han probado los siguientes:

  • los linux-compilado (dmcs) de ejecución binaria en Windows con Mono 2.10: OK
  • los linux-compilado (dmcs) de ejecución binaria en Windows con EM .NET 4.0: OK
  • el windows-compilados (dMCs) se ejecutan en windows binaria con Mono 2.10: OK
  • las ventanas-compilados (dmcs) se ejecutan en windows binaria con MS.NET 4.0: OK
  • las ventanas-compilados (csc.exe) se ejecutan en Windows binaria con Mono 2.10: OK
  • el windows-compilados (csc.exe) de ejecución binaria en Windows 4.0 con MS.NET: OK

En Linux Solo probé el binario compilado por mono, pero no anticipo ningún problema. Tal vez haya algo sutilmente diferente sobre el almacenamiento de dinámicas dentro de la Lista <>, voy a probar que ahora

+0

Muchas gracias @sehe - de hecho, es mi culpa ... pensé que no estaba funcionando debido a que no podía ver en la ventana local. ¡Pero es! –

+0

@DaveMateer Ok, gracias por dejarnos saber – sehe

0

El ExpandoObject es compatible con IDictionary. Puede convertirlo como

IDictionary myModel =(IDictionary)Model; 

Entonces puede repetirlo.

4

El código que tiene, arriba, funciona perfectamente bien para configurar la lista. Por ejemplo, la adición de este después de su código funcionará bien:

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

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

Por ejemplo, pruebe lo siguiente (ejemplo completamente funcional):

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

Esto utiliza el código exacto de la muestra.

+0

Creo que quieres decir 'foreach (var o en model.listOfx)' (dos veces)? – sehe

+0

@sehe Reparado. Gracias. –

Cuestiones relacionadas