2012-08-30 11 views
5

我有一個產生匿名類型的Linq查詢。但是,現在我想使用這個匿名類型的參數,它似乎不工作。選項嚴格和匿名類型不要一起去?

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

現在,編譯器在表達式obj.parameter上拋出一個錯誤:「Option Strict On禁止延遲綁定」。如果我理解正確,編譯器不知道匿名類型的參數。我嘗試了基於Google結果的Option Infer On(並將其作爲對象刪除),但它沒有幫助。這似乎是有道理的,因爲它似乎總是向我轉變。

無論如何解決這個問題,或者我應該只是創建一個自定義類型?

回答

4

聲明匿名類型的代碼(即LINQ查詢的Select部分)必須使用與使用它的代碼相同的方法,並且Query變量的聲明必須具有推斷類型。由於沒有指定類型,因此您無法在匿名類型轉換爲Object後訪問其屬性。

因此,請確保您的LINQ查詢(或至少Select成爲新的匿名類型的部分)使用相同的方法。例如。

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

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

好,所以罪魁禍首是我的IEnumerable聲明? 我正在使用Dim Query作爲IEnumerable(Of Object) – Martao

+0

看起來這確實解決了它。通過使用選項推斷,是否有任何「危險」,我應該知道? – Martao

+3

@Martao:沒有任何危險,事實上,你幾乎需要「Option Infer On」來與Linq和匿名類型高效地合作。 –