问题标签 [expression-trees]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
698 浏览

reflection - 通过 Linq 表达式树 MethodCallExpression 节点调用 F# 函数?

我正在尝试创建一个表达式树,其中包含对某个模块上的 F# 函数的函数调用。但是,我遗漏了一些东西,因为System.Linq.Expressions.Expression.Call()辅助函数找不到我提供的函数。

Call() 调用给出了InvalidOperationException:“类型 'TestReflection.Functions' 上没有方法 'myFunction' 与提供的参数兼容。

如果有人可以提示我做错了什么,那将非常有帮助。

请看下面的代码:

问候, 里卡德

0 投票
3 回答
4859 浏览

c# - iQueryable 和表达式树

谁能通过提供一个非常基本的示例来解释我如何在 C# 中使用 (1) iQueryable (2) 表达式树?两者不相关,而不是提出两个单独的问题,我希望在一个问题中消除我的疑问。

进阶谢谢。

0 投票
1 回答
3657 浏览

c# - Lambda 参数不在范围内——在构建二进制 lambda 表达式时

手动创建 lambda 表达式时,出现“参数不在范围内”异常。

关于我做错了什么的任何想法?

0 投票
5 回答
2359 浏览

c# - 有点好奇理解 .NET 中的表达式树

我已经阅读了几篇关于表达式树的文章和几个stackoverflow.com帖子。它在跳动我的大脑来理解。

问题:

1)像DOM(文档对象模型)一样,它是逻辑的内存表示?

2)有人解释说这是一种将可执行​​代码转换为数据的机制,使用它我们可以生成表示代码的数据结构。

这是否意味着,表达式树用于设计用户定义的模式?

3)大多数示例显示表达式树与Func<>委托或其他委托一起使用,因此使用委托和其他编程结构不能实现与表达式树相同的事情。

初学者可以理解的解释受到高度赞赏。

0 投票
2 回答
673 浏览

c# - 重构函数进入表达>

我有一个当前将 aFunc<Product, string>作为参数的方法,但我需要它是一个Expression<Func<Product, string>>. 使用 AdventureWorks,这是我想使用 Func 做的一个示例。

我希望它看起来像这样:

但是,我遇到的问题myExpression(product)是无效的(不会编译)。在阅读了其他一些帖子后,我明白了为什么。如果不是因为我需要product密钥的第二部分的变量,我可能会这样说:

但我确实需要该product变量,因为我确实需要密钥的第二部分(ProductNumber)。所以我不确定现在该怎么做。我不能将其保留为 Func,因为这会导致问题。我不知道如何使用表达式,因为我看不到如何将product变量传递给它。有任何想法吗?

编辑:这是我如何调用该方法的示例:

0 投票
2 回答
572 浏览

c# - 从属性中检索表达式并将其添加到表达式树

我试图简化这个例子,因为我正在使用的实际代码更复杂。因此,虽然这个例子可能看起来很愚蠢,但请耐心等待。假设我正在使用 AdventureWorks 数据库,并且我决定添加一个名为的属性,该属性返回一个包含我想在多个地方使用的代码的表达式Blarg的表:Product

我想要做的是创建一个表达式表达式树,让它从 Product.Blarg 中获取表达式,并按结果分组。像这样的东西:

显然groupExpression是不正确的(见异常代码注释),但我不知道我应该怎么做。我以为我在说的是“从 中获取表达式product.Blarg,执行它,然后返回字符串结果。” 不过,我想这不是我实际上要说的。我仍在尝试找出表达式树。知道我怎么能做到这一点吗?

0 投票
5 回答
8695 浏览

c# - 从 MemberExpression 中获取对象?

所以,假设我在 C# 中有以下表达式:

如何提取对 foo 的引用?

0 投票
2 回答
1555 浏览

.net - 将 .NET 表达式树链接到新程序集

我正在尝试编写自己的玩具 My Toy Language -> MSIL 编译器,以便更好地了解编译器的工作原理。我得到了解析和词法分析工作,我已经构建了表达式树并使用 System.Linq.Expressions 表达式树 API,我有一个工作解释器。现在我想发出一些真正的 MSIL 程序集。

问题是,我不知道如何实际构建这些程序集。MethodBuilder只接受原始 MSIL 方法体,因此我必须获取表达式树的原始 MSIL。调用Expression.Compile()返回一个工作委托,但我无法获得它的底层 MSIL。调用MethodInfo.GetMethodBody()会引发 InvalidOperationException,因为它未在该特定子类中实现。

如何将该委托链接到新程序集?

0 投票
2 回答
345 浏览

.net - 在 DLR 中避免不必要的装箱

我正在玩 DLR 以更好地理解它。我还不完全熟悉它的所有概念和术语,因此对我的问题中的任何术语或概念错误感到抱歉。

基本上,我理解的方式是在表达式树中传递对象,但使用绑定器将对象的动态功能公开给其他支持 DLR 的语言。因此,不是直接在表达式树中进行添加(例如,使用 Expression.Add),而是创建一个绑定器,调用站点在需要时调用该绑定器并为您执行添加。

但是,由于您传递对象,因此在加法操作结束时(例如,如果操作数是两个 Int32 值),您将不得不将生成的 Int32 装箱到一个对象,因为(仍在活页夹中)调用什么网站预计。我有点担心这种不断的装箱/拆箱可能会在一定程度上影响运行时的性能。

这真的是它应该如何工作(所有装箱/拆箱)还是我错过了什么?

0 投票
1 回答
2545 浏览

c# - 多项式评估的生成方法

我试图想出一种优雅的方式来处理一些生成的多项式。这是我们将(专门)针对这个问题关注的情况:

  1. order是生成n阶多项式的参数,其中 n:=order + 1。
  2. i是 0..n 范围内的整数参数
  3. 多项式在 x_j 处为零,其中 j = 1..n 且 j ≠ i(此时应该清楚 StackOverflow 需要一个新功能,或者它存在但我不知道)
  4. 多项式在 x_i 处计算为 1。

由于这个特定的代码示例生成 x_1 .. x_n,我将解释如何在代码中找到它们。这些点均匀分布x_j = j * elementSize / order,其中n = order + 1

我生成一个Func<double, double>来评估这个多项式¹。

问题:我还需要评估 ψ′=dψ/dx。为此,我可以将 ψ=scale×(x_0 - x)(x_1 - x)×..×(x_n - x)/(x_i - x) 重写为 ψ=α_n×x^n + α_n×x ^(n-1) + .. + α_1×x + α_0。这给出了ψ′=n×α_n×x^(n-1) + (n-1)×α_n×x^(n-2) + .. + 1×α_1。

出于计算原因,我们可以Math.Pow通过写ψ′=x×(x×(x×(..) - β_2) - β_1) - β_0 来重写最终答案而不需要调用。

为了做所有这些“诡计”(所有非常基本的代数),我需要一种干净的方法来:

  1. 展开一个因式Expression包含ConstantExpressionParameterExpression叶子和基本的数学运算(以运算BinaryExpressionNodeType集合结束)——这里的结果可以包括我们将在整个过程中以特殊方式处理的元素InvocationExpressionMethodInfoMath.Pow
  2. 然后我对一些指定的ParameterExpression. 结果中调用 的右侧参数为Math.Pow常数 2 的项被替换为ConstantExpression(2)乘以左侧的Math.Pow(x,1)值(删除了 的调用)。结果中的项因相对于 x 为常数而变为零。
  3. 然后将某些特定的实例ParameterExpression分解为调用的左侧参数Math.Pow。当调用的右侧变成ConstantExpression带有 value的 a 时1,我们将调用替换为ParameterExpression本身。

¹将来,我希望该方法采用 aParameterExpression并返回Expression基于该参数进行评估的 an 。这样我就可以聚合生成的函数。我还没到。² 将来,我希望发布一个通用库,用于将 LINQ 表达式用作符号数学。