2010-04-02 19 views
17

Cho cấu trúc lớp cha/con đơn giản. Tôi muốn sử dụng linqkit để áp dụng một biểu thức lambda con trên phụ huynh. Tôi cũng muốn biểu thức Lambda được cung cấp bởi một phương thức tiện ích.Hệ thống LinqKit.InvalidCastException Khi gọi biểu thức do phương thức cung cấp trên thuộc tính thành viên

public class Foo 
{ 
    public Bar Bar { get; set; } 
} 

public class Bar 
{ 
    public string Value { get; set; } 
    public static Expression<Func<Bar, bool>> GetLambdaX() 
    { 
     return c => c.Value == "A"; 
    } 
} 
... 

Expression<Func<Foo, bool>> lx = c => Bar.GetLambdaX().Invoke(c.Bar); 
Console.WriteLine(lx.Expand()); 

Đoạn mã trên ném

System.InvalidCastException: Unable to cast object of type 
'System.Linq.Expressions.MethodCallExpression' to type 
'System.Linq.Expressions.LambdaExpression'. 
at LinqKit.ExpressionExpander.VisitMethodCall(MethodCallExpression m) 
at LinqKit.ExpressionVisitor.Visit(Expression exp) 
at LinqKit.ExpressionVisitor.VisitLambda(LambdaExpression lambda) 
at LinqKit.ExpressionVisitor.Visit(Expression exp) 
at LinqKit.Extensions.Expand<TDelegate>(Expression`1 expr) 
+0

Tôi sẽ trợ giúp nhưng tôi không thể lấy mã của bạn để biên dịch. Dòng lx không hoạt động. – Nix

+0

Không biên dịch cho tôi, dòng lx phải ở ví dụ như phương thức util – user293499

Trả lời

26
var lambdaX = Bar.GetLambdaX(); 

Expression<Func<Foo, bool>> lx = c => lambdaX.Invoke(c.Bar); 

này hoạt động.

Hãy cẩn thận với cách viết

Expression<Func<Foo, bool>> lx = ... 

Trước khi chuyển nhượng các quá trình biên dịch dòng này và trong trường hợp của bạn tạo ra một phương pháp Gọi Biểu hiện (ví dụ: để gọi Bar.GetLambdaX()) được gán cho lx.

Nếu bạn sử dụng var ... thì Bar.GetLambdaX(); được gọi và được chỉ định, giá trị trong đó (biểu thức lambda) được sử dụng sau này trong lx = ...

+2

+1 Câu trả lời hay! Sự khác biệt theo ngữ cảnh về cách trình biên dịch xử lý các câu lệnh trong các biểu thức lambda có thể dẫn đến một số lỗi biên dịch rất không trực quan. –

+0

@DoctorJones Đây không phải là lỗi trình biên dịch. Đây chỉ là một lỗi trong LINQKit. Nó không hỗ trợ tình huống này khi cần. Nó có thể được viết để hỗ trợ mã này và hoạt động chính xác (tôi có phiên bản của riêng tôi cùng một công cụ xử lý mã này tốt), nó chỉ là không. – Servy

+0

Tôi không nói đó là lỗi trình biên dịch (tức là lỗi với trình biên dịch), tôi đã nói đó là lỗi biên dịch (và lỗi xảy ra trong quá trình biên dịch). Tôi đồng ý rằng nó sẽ được tốt đẹp nếu LINQKit hỗ trợ này, tôi cũng có phiên bản LINQKit của riêng tôi xử lý nhiều tình huống hơn là nó ra khỏi hộp. –

Các vấn đề liên quan