如何将 Func<T,bool> 转换为 Expression<Func<T,bool>>?

10
我有一个这样的Func:

代码如下:

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

我怎样才能将它转换为:
 Expression<Func<MyClass, bool>>

1
表达式是Lambda函数的中间表示形式。Func是编译后的Lambda函数本身。不要认为你可以在两者之间进行转换。你为什么需要这样做呢? - akhisp
3个回答

14

你可以只写:

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主体的表达式树。


6

试试这个:

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

1
这实际上将 expr 设置为调用一个委托,该委托接受 MyClass 并返回 boolexpr 不会保存实际 lambda 的语法树。 - Sean
是的,没错。那又怎样呢?也许问题的作者应该就是那样。 - Memoizer
1
这不应该被接受的答案。该方法根本没有转换为表达式。 - Mr Anderson
该方法将转换为表达式。 - Memoizer

2

您可以创建表示对所创建委托的调用的表达式。但是大多数情况下,当您使用 Expression 时,您这样做是为了理解代码的功能(例如将其转换为 SQL)。而对于调用不透明函数的表达式,您无法这样做。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接