2012-08-30 9 views
5

Tôi có truy vấn LINQ cho ra các loại ẩn danh. Tuy nhiên, bây giờ tôi muốn làm việc với các tham số của kiểu ẩn danh này và nó dường như không hoạt động.Tùy chọn Loại nghiêm ngặt và ẩn danh không đi cùng nhau?

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

Bây giờ trình biên dịch đưa ra lỗi trên biểu thức obj.parameter: "Tùy chọn Strict On disallows late binding". Nếu tôi hiểu đúng, trình biên dịch không biết các tham số của kiểu ẩn danh. Tôi đã thử Option Infer On (và gỡ bỏ As Object), dựa trên kết quả của Google, nhưng nó không giúp được gì. Điều đó có vẻ hợp lý, bởi vì nó luôn có vẻ là một sự chuyển đổi mở rộng với tôi.

Có cách nào để sửa lỗi này hay tôi chỉ cần tạo loại tùy chỉnh?

Trả lời

4

Mã khai báo loại ẩn danh (tức là Select một phần của truy vấn LINQ) phải bằng cùng phương pháp với mã sử dụng mã đó và khai báo của biến Query phải có loại được phỏng đoán. Bạn không thể truy cập các thuộc tính của một loại vô danh sau khi nó đã được đúc thành một Object vì không có loại được đặt tên để bạn có thể truyền nó.

Vì vậy, hãy đảm bảo rằng truy vấn LINQ của bạn (hoặc, ít nhất, phần Select s vào một loại ẩn danh mới) có cùng phương pháp. Ví dụ.

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

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

Ok vậy thủ phạm là khai báo IEnumerable của tôi? Tôi đã sử dụng Dim Query As IEnumerable (Of Object) – Martao

+0

Dường như điều này đã giải quyết được nó. Có bất kỳ "nguy hiểm" nào bằng cách sử dụng suy luận tùy chọn mà tôi nên biết không? – Martao

+3

@Martao: Không có nguy hiểm, trên thực tế bạn khá cần "Option Infer On" để hoạt động hiệu quả với Linq và các loại ẩn danh. –