2013-02-16 184 views
5

我有一個函數功能是這樣的:如何Func鍵<T,bool>轉換爲表達<Func<T,bool>>

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

我怎樣才能將其轉換爲:

Expression<Func<MyClass, bool>> 
+1

表達式是Lambda函數的中間表示形式。 Func本身就是編譯的lambda函數。不要以爲你可以在兩者之間進行轉換。你爲什麼需要這樣做? – akhisp 2013-02-16 05:41:50

回答

3

試試這個:

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

這實際上將'expr'設置爲對帶有'MyClass'並返回'bool'的委託的調用。 'expr'不會爲實際的lambda保留一個語法樹。 – Sean 2013-02-18 11:47:54

+0

是的。所以呢?也許這個問題的作者應該就是這樣。 – Memoizer 2013-02-18 17:09:25

+1

這不應該被接受的答案。該方法不會被轉換爲任何表達式。 – 2016-08-16 02:32:55

2

您可以創建一個表達式來表示對創建的委託的調用。但大多數情況下,當您使用Expression時,您需要這樣做來了解代碼的作用(例如將其轉換爲SQL)。你不能用表達式來調用一個不透明的函數。

9

你可以這樣寫:

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

這將設置expr成爲Id == 5表達式樹。

如果你這樣做:

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

那麼這將設置expr成爲呼叫的表達式樹func,不是爲了func身體表達式樹。

相關問題