2009-08-21 57 views

Trả lời

50

Bạn phải gán lambda để một kiểu khác nhau:

// Gives you a delegate: 
Func<int, int> f = x => x * 2; 
// Gives you an expression tree: 
Expression<Func<int, int>> g = x => x * 2; 

Cũng vậy với đối số phương pháp. Tuy nhiên, khi bạn đã gán biểu thức lambda như vậy cho loại Func<>, bạn không thể lấy lại biểu thức cây.

+3

Ủy nhiệm là một thuật ngữ tốt hơn lambda, trong trường hợp đầu tiên. Cả hai đều là các biểu thức lambda, một biểu thức được chuyển đổi hoàn toàn thành một đại biểu vô danh, một cây biểu thức khác. – nawfal

+0

@nawfal * 'f' * là một đại biểu. Nhưng 'x => x * 2' là một biểu thức lambda (như bạn đã lưu ý). Nhận xét của bạn ngụ ý rằng tôi đã nói điều gì đó khác nhưng tôi thực sự thì không. –

+1

Bạn cho biết biểu thức thứ hai cung cấp cho bạn một cây biểu thức. Tương tự như vậy, biểu thức lambda đầu tiên nên * cung cấp cho bạn một đại biểu *, không phải là * lambda * - đó là ý kiến ​​đầu tiên của bạn. Không nitpicking, chỉ đề cập đến để nó giúp một ai đó trong tương lai. – nawfal

10

Trả lời của Konrad là chính xác. Bạn cần gán biểu thức lambda cho Expression<Func<...>> để trình biên dịch tạo ra cây biểu thức. Nếu bạn nhận được một lambda như là một Func<...>, Action<...> hoặc loại đại biểu khác, tất cả các bạn có là một loạt các hướng dẫn IL.

Nếu bạn thực sự cần để có thể chuyển đổi một lambda biên dịch IL trở lại thành cây biểu thức, bạn phải dịch ngược nó (ví dụ: làm công cụ Reflector của Lutz Roeder). Tôi khuyên bạn nên xem thư viện Cecil, cung cấp hỗ trợ thao tác IL nâng cao và có thể giúp bạn tiết kiệm khá nhiều thời gian.

6

Chỉ cần mở rộng câu trả lời của Konrad, và để sửa Pierre, bạn vẫn có thể tạo biểu thức từ một lambda biên dịch IL, mặc dù nó không quá tao nhã. Ví dụ về Augmenting của Konrad:

// Gives you a lambda: 
Func<int, int> f = x => x * 2; 

// Gives you an expression tree: 
Expression<Func<int, int>> g = x => f(x); 
+11

Điều này ** không ** cung cấp cho bạn cây biểu thức của lamda gốc, nó cung cấp cho bạn một cây biểu thức ** mới ** gọi cho đại biểu. Chỉ có bấy nhiêu thôi. – Aidiakapi

+0

Câu hỏi không cụ thể khi nhận biểu thức * tương đương *. Đối với LINQ trong bộ nhớ, chức năng này giống hệt nhau. Tất nhiên nó không thể được phân tích cú pháp đúng cách bởi bất kỳ nhà cung cấp LINQ nào. – joniba

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