2013-02-16 22 views
5

Mam Func takiego:Jak przekonwertować Func <T,bool> ekspresji <Func<T,bool>>

Func<MyClass, bool> func = x=>Id == 5; 

Jak mogę przekonwertować go do:

Expression<Func<MyClass, bool>> 
+1

Wyrażenie jest pośrednim przedstawieniem funkcji Lambda. Func to skompilowana funkcja lambda. Nie myśl, że możesz dokonać konwersji między tymi dwoma. Dlaczego musisz to robić? – akhisp

Odpowiedz

3

Spróbuj tego:

Func<MyClass, bool> func = x=>Id == 5; 
Expression<Func<MyClass, bool>> expr = mc => func(mc); 
+1

To faktycznie ustawia 'wyr 'na wywołanie do delegata, który bierze' MyClass' i zwraca 'bool'. 'expr' nie będzie przechowywać drzewa składni dla rzeczywistej lambda. – Sean

+0

Tak, jest. Więc co? Być może autor pytania powinien być po prostu tym. – Memoizer

+1

Ta odpowiedź nie powinna być akceptowana. Metoda nie jest konwertowana na wyrażenie. –

2

Możesz utworzyć wyrażenie reprezentujące połączenie z delegatem, który utworzyłeś. Ale większość czasu, gdy używasz Expression s, robisz to, aby zrozumieć, co robi kod (na przykład, aby przekonwertować go do SQL). Nie można tego zrobić za pomocą wyrażenia wywołującego funkcję nieprzezroczystą.

9

można po prostu napisać:

Expression<Func<MyClass,bool>> expr = x=>Id == 5; 

Spowoduje to ustawienie expr być drzewo wyrażenie Id == 5.

Jeśli zrobić:

Func<MyClass, bool> func = x=>Id == 5; 
Expression<Func<MyClass, bool>> expr = mc => func(mc); 

Wtedy to ustawić expr być drzewo wyrażenie na wezwanie do func, a nie drzewa wyrażenie dla ciała func.

Powiązane problemy