c# - 需要一种方法来获取构建给定表达式树的代码

标签 c# code-generation expression-trees

在C#中构造表达式树有两种方式:

  1. 让编译器重写一个lambda并存储结果;
  2. 分段构建它,调用 Expression 类提供的工厂方法。

第一种方法很简单,但它无法让我将现有的子表达式集成到结果表达式中,而这是我的主要目标。 (这些 subs 按照设计作为函数参数传递给我)。

事实上,第二种方法本身子表达式组合过程,但它非常除了最简单的表达式之外的任何东西都非常麻烦,几乎不涉及嵌套。 p>

因此,为了充分利用两种方法,同时必须分段构建树,我查看了编译器生成的表达式,并将它们用作提示。我所做的是:编写代码来构造一棵树,同时查看给定的树。整个过程相当常规,所以我想:

  • 是否有工具可以自动执行此操作?我自己找不到。
  • 除了 codegens 之外,是否还有其他方法可以改进我的方法并提高其效率?

这里解释了为什么我需要这个奇怪的过程。

Expression<Func<IEnumerable<N>, IEnumerable<N>, IEnumerable<N>>>
    MyExpression = (src1, src2) => 
        src1.SelectMany(outer => lookup[outer.Value1].Select(
                inner => new N(outer, inner)));

现在,我得到了两个子表达式,它们将代替 outer.Value1new N(outer, inner) 放置。我不能使用 .Compile() 并将它们用作 lambda,因为我必须提供完整的表达式树以供进一步处理。我需要一种将它们集成到 MyExpression 中的方法,我知道的唯一方法是通过 Expression 工厂构建整个树。但是对于更复杂的查询,它会变得极其复杂且容易出错。

最佳答案

aside from codegens, are there some other possibilities to improve my method and make it more productive?

基本上,您需要编写一个扩展 ExpressionVisitor 的类用另一个表达式的部分替换一个表达式的某些组件。

are there tools to automate that?

LINQKit就是这样做的。来自网站的示例:

Expression<Func<Purchase,bool>> criteria1 = p => p.Price > 1000;
Expression<Func<Purchase,bool>> criteria2 = p => criteria1.Invoke (p)
                                             || p.Description.Contains ("a");

Console.WriteLine (criteria2.Expand().ToString());

输出:

p => ((p.Price > 1000) || p.Description.Contains("a"))

关于c# - 需要一种方法来获取构建给定表达式树的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25220599/

相关文章:

c# - 如何设置程序的CPU亲和性?

c - 在 C 中,将结构作为参数传递给 printf 的预期行为是什么?

c# - 动态 Linq where 子句抛出 OutOfMemoryException

c# - 使用 LINQ 从树数据结构中获取级别的最佳方法是什么?

c# - 将定制的 Linq-2-SQL 迁移到 Entity Framework

git - 我应该将Flutter/Dart中生成的代码提交到VCS吗

java - C 中的 JSON 模式代码生成

c# - Expression.Call GroupBy 然后 Select 和 Count()?

C# Expression Tree调用基类属性get方法

c# - Winforms 中应用程序范围组件应该放在哪里?