gpt4 book ai didi

c# - Func 或 Predicate 到 ExpressionTree

转载 作者:行者123 更新时间:2023-11-30 13:42:17 26 4
gpt4 key购买 nike

假设我有:

 Func<Customer,bool > a = (c) => c.fullName == "John";

现在我想通过任何方式转换为 expressiontree 吗?

我知道我可以从一开始就将它定义为表达式树,但我的情况有所不同,因为我必须先连接一些 lambda 表达式,然后将它传递给采用表达式树的方法,这样做会导致编译时错误!

例子:

        Func<Customer, bool> a = (c) => c.fullName == "John";
Func<Customer, bool> b = (c) => c.LastName == "Smith";
Func<Customer, bool> final = c => a(c) && b(c);

现在我想将 final 传递给一个采用

的方法
ExpressionTree<Func<Customer,bool >>

编译时报错

提前致谢

最佳答案

你不能那样做。 Func<...> 类型的变量是一个委托(delegate),它基本上就像一个指向包含 lambda 表达式的编译代码 的内存位置的指针。 .NET 中没有将已编译代码转回表达式树的功能。

根据您尝试执行的操作,也许您可​​以使用一个不完整的解决方案:创建一个调用委托(delegate)的表达式树。由于我对您想将表达式树传递到的方法一无所知,因此我不知道这对您来说是否是一个可行的解决方案。

总结:如果你想要所有表达式的完整表达式树,你需要确保它们从一开始就是表达式树。一旦将其编译为委托(delegate),表达式树就会丢失。

一旦你确定它们是表达式树,你就可以使用类似下面的东西来组合它们:

Expression<Func<Customer, bool>> a = c => c.FullName == "John";
Expression<Func<Customer, bool>> b = c => c.LastName == "Smith";

var cp = Expression.Parameter(typeof(Customer), "c");

var ai = Expression.Invoke(a, cp);
var bi = Expression.Invoke(b, cp);

var final = Expression.Lambda<Func<Customer, bool>>(
Expression.AndAlso(ai, bi), cp);

当然,这使用了AndAlso运算符(&&);你也可以使用 OrElse对于 ||等等

关于c# - Func 或 Predicate 到 ExpressionTree,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3448700/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com