2012-08-30 9 views
5

Ho una query Linq che restituisce tipi anonimi. Tuttavia, ora voglio lavorare con i parametri di questo tipo anonimo e non sembra funzionare.Opzione Rigorosa e tipi anonimi non vanno insieme?

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

Ora il compilatore genera un errore sul obj.parameter espressione: "Option Strict On non consente l'associazione tardiva". Se capisco bene, il compilatore non conosce i parametri del tipo anonimo. Ho provato Option Infer On (e rimosso As Object), in base ai risultati di Google, ma non ha aiutato. Il che sembra avere un senso, perché mi sembra sempre una conversione sempre più ampia.

Esiste comunque una soluzione per questo problema oppure devo semplicemente creare un tipo personalizzato?

risposta

4

Il codice che dichiara il tipo anonimo (ovvero la parte Select della query LINQ) deve essere nello stesso metodo del codice che lo utilizza e la dichiarazione della variabile Query deve avere un tipo dedotto. Non è possibile accedere alle proprietà di un tipo anonimo dopo che è stato eseguito il cast su un Object poiché non esiste un tipo con nome al quale è possibile eseguire il cast.

Assicurarsi quindi che la query LINQ (o, almeno, la parte che è Select in un nuovo tipo anonimo) sia nello stesso metodo. Per esempio.

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

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

Ok, quindi il colpevole è la mia dichiarazione IEnumerable? Stavo usando Dim Query As IEnumerable (Of Object) – Martao

+0

Sembra che questo sia stato risolto. C'è qualche "pericolo" usando l'opzione inferenziale su cui dovrei essere a conoscenza? – Martao

+3

@Martao: Non c'è alcun pericolo, infatti hai praticamente bisogno di "Option Infer On" per lavorare in modo efficiente con Linq e tipi anonimi. –