2013-02-16 137 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身体表达式树。

相关问题