2012-08-30 16 views
5

Tengo una consulta de Linq que arroja tipos anónimos. Sin embargo, ahora quiero trabajar con los parámetros de este tipo anónimo y no parece funcionar.Opción Los tipos estrictos y anónimos no van juntos?

For Each obj As Object in Query 
Dim row As DataRow = obj.parameter 
... 
Next obj 

Ahora el compilador genera un error en la obj.parameter expresión: "Option Strict On no permite el enlace en tiempo". Si lo entiendo bien, el compilador no conoce los parámetros del tipo anónimo. Probé Option Infer On (y eliminé As Object), según los resultados de Google, pero no me ayudó. Lo cual parece tener sentido, porque siempre parece ser una conversión cada vez más amplia para mí.

¿Hay alguna forma de arreglar esto, o debería simplemente crear un tipo personalizado?

Respuesta

4

El código que declara el tipo anónimo (es decir, la parte Select de su consulta LINQ) debe tener el mismo método que el código que lo utiliza y la declaración de la variable Query debe tener un tipo inferido. No puede acceder a las propiedades de tipo anónimo una vez que se ha lanzado a Object ya que no existe un tipo de nombre con el que pueda emitirlo.

Así que asegúrese de que su consulta LINQ (o, al menos, la parte que Select s en un nuevo tipo anónimo) está en el mismo método. P.ej.

Dim Query = From prod In products 
      Select prod.Name, prod.Price 

For Each obj in Query 
    Dim name = obj.Name 
    ... 
Next obj 
+0

Ok, ¿el culpable es mi declaración de IEnumerable? Estaba usando Dim Query como IEnumerable (Of Object) – Martao

+0

Parece que esto lo resolvió de hecho. ¿Hay algún "peligro" al usar la opción inferir de la que debería estar consciente? – Martao

+3

@Martao: no hay peligro, de hecho, usted necesita prácticamente "Option Infer On" para trabajar eficientemente con Linq y tipos anónimos. –

Cuestiones relacionadas