2009-12-06 37 views
7

Tôi đã tạo biểu thức lambda trong thời gian chạy và muốn đánh giá nó - làm cách nào để thực hiện điều đó? Tôi chỉ muốn chạy các biểu hiện của chính nó, không phải chống lại bất kỳ bộ sưu tập hoặc các giá trị khác.Nhận kết quả từ Biểu thức

Ở giai đoạn này, khi nó được tạo, tôi có thể thấy rằng nó thuộc loại Expression<Func<bool>>, với giá trị là {() => "MyValue".StartsWith("MyV")}.

Tôi nghĩ tại thời điểm đó tôi chỉ có thể gọi var result = Expression.Invoke(expr, null); chống lại nó và tôi sẽ có kết quả boolean của mình. Nhưng điều đó chỉ trả lại một số InvocationExpression, trong trình gỡ lỗi trông giống như {Invoke(() => "MyValue".StartsWith("MyV"))}.

Tôi khá chắc chắn tôi đã đóng, nhưng không thể tìm ra cách để có được kết quả của mình!

Cảm ơn.

Trả lời

14

Hãy thử biên dịch biểu thức với phương pháp Compile sau đó gọi các đại biểu được trả về:

using System; 
using System.Linq.Expressions; 

class Example 
{ 
    static void Main() 
    { 
     Expression<Func<Boolean>> expression 
       =() => "MyValue".StartsWith("MyV"); 
     Func<Boolean> func = expression.Compile(); 
     Boolean result = func(); 
    } 
} 
+0

Cảm ơn , chính xác những gì tôi đã mất tích. Và giải thích rõ ràng quá :) – Marcus

+0

@Marcus - Rất vui được giúp đỡ! –

+0

Chỉ cần một chút đường cú pháp. Bạn có thể thay thế hai dòng cuối cùng chỉ bằng một dòng: Boolean result = expression.Compile()(); –

2

Như Andrew đề cập, bạn phải biên dịch một Expression trước khi bạn có thể thực hiện nó. Các tùy chọn khác là không sử dụng một biểu thức ở tất cả, mà woul dlook như thế này:

Func<Boolean> MyLambda =() => "MyValue".StartsWith("MyV"); 
var Result = MyLambda(); 

Trong ví dụ này, khái niệm lambda được biên dịch khi bạn xây dựng dự án của bạn, thay vì được chuyển đổi thành một cây biểu thức. Nếu bạn không tự động thao tác các cây biểu thức hoặc sử dụng một thư viện sử dụng các cây biểu thức (LINQ to Sql, LINQ to Entities, v.v.), thì nó có thể có ý nghĩa hơn để thực hiện theo cách này.

+0

Trong trường hợp này, tôi tự động tạo cây biểu thức, vì vậy sẽ cần phải biên dịch khi chạy. Cảm ơn mặc dù. – Marcus

1

Con đường tôi sẽ làm điều đó được nâng lên ngay từ ở đây: MSDN example

delegate int del(int i); 
static void Main(string[] args) 
{ 
    del myDelegate = x => x * x; 
    int j = myDelegate(5); //j = 25 
} 

Ngoài ra nếu bạn muốn sử dụng một loại Expression<TDelegate> sau đó trang này: Expression(TDelegate) Class (System.Linq.Expression) có ví dụ sau:

// Lambda expression as executable code. 
Func<int, bool> deleg = i => i < 5; 
// Invoke the delegate and display the output. 
Console.WriteLine("deleg(4) = {0}", deleg(4)); 

// Lambda expression as data in the form of an expression tree. 
System.Linq.Expressions.Expression<Func<int, bool>> expr = i => i < 5; 
// Compile the expression tree into executable code. 
Func<int, bool> deleg2 = expr.Compile(); 
// Invoke the method and print the output. 
Console.WriteLine("deleg2(4) = {0}", deleg2(4)); 

/* This code produces the following output: 
    deleg(4) = True 
    deleg2(4) = True 
*/ 
Các vấn đề liên quan