2011-02-07 13 views
7

Biorąc pod uwagę następujący przykład stwierdzenie lambda:NET - wysypisko rachunek lambda ciało ciąg

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

Jakie są możliwe sposoby, aby zdobyć ciało tej lambda i zrzucić go na ciąg? (Coś, co ostatecznie pozwoli na zapisanie metody rozszerzenia dla klasy Action tego rodzaju: fMyAction.Dump(), która zwróci "x += 2; something = what + ever;").

Dzięki

+0

Do czego służy? Proszę podać więcej informacji na temat swojego pytania, prawdopodobnie istnieje zupełnie inne rozwiązanie. To, co próbujesz teraz zrobić, jest prawie niemożliwe i nie ma sensu w C-ostrym. –

+1

@ SK-logic: Byłoby to zdecydowanie poza zakresem tego konkretnego stanowiska, aby omówić moje własne powody na abstrakcyjnym poziomie. –

+0

nie otrzymasz użytecznej odpowiedzi, nie wyjaśniając przynajmniej, dlaczego potrzebujesz reprezentacji ciągów, jak blisko powinien być ten ciąg do oryginalnego źródła i jakie są twoje wymagania dotyczące wydajności. Oprócz dekompilacji dostępnych jest kilka opcji. –

Odpowiedz

11

Nie jest to możliwe w tej formie. Twoja lamda zostanie skompilowana do kodu bajtowego. O ile teoretycznie możliwe jest dekompilowanie kodu bajtowego, tak jak robi to reflektor, jest on trudny, podatny na błędy i nie daje dokładnego kodu, który skompilowałeś, ale tylko kod, który jest równoważny.

Jeśli masz use an Expression<Action> zamiast tylko Action otrzymasz drzewo wyrażenia opisujące Lamę. Konwertowanie drzewa wyrażeń na łańcuch jest możliwe (i istnieją istniejące biblioteki, które to robią).

Ale to nie jest możliwe w twoim przykładzie, ponieważ jest to wielosłowiańska lamda. I tylko proste lamdas mogą być automatycznie konwertowane do drzewa wyrażeń.

+0

Masz rację ... Znalazłem to i byłem gotowy, aby otworzyć szampana: http://code.msdn.microsoft.com/exprserialization Następnie nagle: http://msdn.microsoft.com/en-us/ library/bb397745.aspx –