2011-02-07 25 views
7

Với tuyên bố lambda sau Ví dụ:NET - bãi tuyên bố lambda cơ thể để chuỗi

var fMyAction = new Action(() => 
{ 
    x += 2; 
    something = what + ever; 
}); 

cách có thể để có được cơ thể của lambda đó và đổ nó vào chuỗi là gì? (Thứ gì đó cuối cùng sẽ cho phép viết phương thức mở rộng cho Action loại này: fMyAction.Dump() sẽ trả về "x += 2; something = what + ever;").

Cảm ơn

+0

Nó dùng để làm gì? Vui lòng cung cấp thêm thông tin cơ bản về câu hỏi của bạn, có thể có một giải pháp hoàn toàn khác. Những gì bạn đang cố gắng làm bây giờ là hầu như không thể và không có ý nghĩa gì trong C-sharp. –

+1

@ SK-logic: Điều đó chắc chắn sẽ nằm ngoài phạm vi của bài đăng cụ thể này để thảo luận các lý do của riêng tôi về mức trừu tượng. –

+0

bạn sẽ không nhận được câu trả lời hữu ích mà không giải thích ít nhất tại sao bạn cần một biểu diễn chuỗi, cách chuỗi này phải là nguồn gốc và yêu cầu hiệu suất của bạn là bao nhiêu. Có một số tùy chọn có sẵn bên cạnh việc giải mã. –

Trả lời

11

Không thể có trong biểu mẫu đó. Lamda của bạn được biên dịch thành mã byte. Mặc dù trong lý thuyết có thể dịch ngược mã byte, giống như phản xạ, nhưng rất khó, dễ xảy ra lỗi và không cung cấp cho bạn mã chính xác mà bạn đã biên dịch, nhưng chỉ mã tương đương.

Nếu bạn use an Expression<Action> thay vì chỉ Action bạn sẽ nhận được cây biểu thức mô tả lamda. Và chuyển đổi một cây biểu thức thành một chuỗi là có thể (và có các thư viện hiện có làm điều đó).

Nhưng điều đó là không thể trong ví dụ của bạn vì đó là một lệnh đa lamda. Và chỉ các lệnh lamdas đơn giản mới có thể được chuyển đổi tự động thành cây biểu thức.

+0

Bạn nói đúng ... Tôi đã tìm thấy điều này và sẵn sàng mở champagne: http://code.msdn.microsoft.com/exprserialization Sau đó đột ngột: http://msdn.microsoft.com/en-us/ library/bb397745.aspx –