2012-05-07 17 views
6

Aquí está mi código:la conversión dinámica de oponerse

MyClass here = new MyClass(); 
IEnumerable<MyClass> vats = (IEnumerable<MyClass>)here.All(); 

El método Todos() devuelve IEnumerable < dinámico>. Quiero convertirlo a IEnumerable < MyClass>. La línea de arriba no funciona, dice No se puede lanzar el objeto de tipo 'd__15' para escribir 'System.Collections.Generic.IEnumerable`1 [MyClass]'.

También probé:

IEnumerable<MyClass> vats = here.All() as IEnumerable<MyClass>; 

pero devuelve un valor nulo.

+0

¿Cómo se implementa All()? – Tigran

+0

@Tigran Aquí está. Mira el archivo Massive.cs. https://github.com/robconery/massive –

+0

¿Alguna razón por la que no puedes mantenerla "dinámica" en tu código? –

Respuesta

6

Similar a la respuesta de dbaseman (y el comentario de AKX) que haría uso de Cast:

IEnumerable<MyClass> vats = here.All().Cast<MyClass>(); 

que necesitará una directiva using de LINQ embargo:

using System.Linq; 

en la parte superior de su archivo. Parece que no lo tiene si no se reconoce el método Select.

Tenga en cuenta que esto supone que cada valor realmente es una referencia MyClass.

EDIT: Si usted quiere ser capaz de acceder a los valores de índice, me gustaría recomendar el uso ToList:

List<MyClass> vats = here.All().Cast<MyClass>().ToList(); 

Mientras ToArray funcionaría también, yo personalmente a favor enumera más de matrices en la mayoría de los casos, como se son bastante más flexibles.

EDITAR: Parece que sus resultados están realmente llenos de ExpandoObject. Deberá crear una nueva instancia de MyClass de cada elemento, p.

List<MyClass> vats = here.All() 
         .Select(item => new MyClass(item.Name, item.Value)) 
         .ToList(); 

o posiblemente:

List<MyClass> vats = here.All() 
         .Select(item => new MyClass { 
            Name = item.Name, 
            Value = item.Value, 
           }) 
         .ToList(); 

Eso es simplemente un ejemplo, que no esperaría a trabajar de inmediato - que no se puede hacer nada mejor que eso, ya no sabemos nada acerca de cómo sus resultados en realidad están siendo devueltos.

Suena como si estuvieras en tu cabeza aquí, me temo.

+0

¿Y dónde buscar mis valores? [0], cubas [1]. Para el resultado aquí. Todo() Podría acceder a esos valores como –

+0

@srcee si desea tener un indexador (en lugar de iterar toda la lista) que necesitaría anexar .ToArray() después de la llamada para seleccionar –

+0

@ Srcee: Puedes * iterar * sobre tus valores desde solo una secuencia, pero si quieres un indexador necesitarás una lista o una matriz. Pero parece que eres nuevo en C# y LINQ, en cuyo caso sugiero que te mantengas alejado de la escritura dinámica durante un tiempo si puedes ... va a ser más difícil comprender lo básico ... –

1

Sólo hay que echar cada objeto individual:

MyClass[] vats = here.All().Select(item => (MyClass)(dynamic)item).ToArray(); 
+1

'here.Cast ()' también funcionaría, supongo. – AKX

+0

@dbaseman Me sale un error del compilador: no hay un método Select. –

+0

@Scree editado. Perdón por eso, leíste tu pregunta. – McGarnagle

0

Lo primero que debe resolver antes de poder crear una solución es qué tipos tendrán los objetos en tiempo de ejecución. Viendo por tus comentarios que van a ser ExpandoObjects y asumiendo que MyClass no proviene de ExpandoObject, no puedes usar el método .Cast<T>, ya que solo admite moldes y no conversiones personalizadas.

Hay un truco que puede utilizar para convertir de ExpandoObjects utilizando el JavaScriptSerializer

tomando de esta link aquí un método de extensión que se puede utilizar

public static IEnumerable<T> Convert<T>(this IEnumerable<dynamic> self){ 
    var jsSerializer = new JavaScriptSerializer(); 
    foreach(var obj in self){ 
     yield return jsSerializer.ConvertToType<T>(obj); 
    } 
} 

en su caso, entonces todo lo que tiene que hacer es cambiar la respuesta Cast in skeets para Convertir.

List<MyClass> vats = here.All().Convert<MyClass>().ToList(); 

Esto es un poco ya que el hacker JavaScriptSerializer no estaba destinado a hacer esto, pero no resuelve el problema.

Cuestiones relacionadas