问题标签 [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.
reflection - 通过 Linq 表达式树 MethodCallExpression 节点调用 F# 函数?
我正在尝试创建一个表达式树,其中包含对某个模块上的 F# 函数的函数调用。但是,我遗漏了一些东西,因为System.Linq.Expressions.Expression.Call()辅助函数找不到我提供的函数。
Call() 调用给出了InvalidOperationException:“类型 'TestReflection.Functions' 上没有方法 'myFunction' 与提供的参数兼容。 ”
如果有人可以提示我做错了什么,那将非常有帮助。
请看下面的代码:
问候, 里卡德
c# - iQueryable 和表达式树
谁能通过提供一个非常基本的示例来解释我如何在 C# 中使用 (1) iQueryable (2) 表达式树?两者不相关,而不是提出两个单独的问题,我希望在一个问题中消除我的疑问。
进阶谢谢。
c# - Lambda 参数不在范围内——在构建二进制 lambda 表达式时
手动创建 lambda 表达式时,出现“参数不在范围内”异常。
关于我做错了什么的任何想法?
c# - 有点好奇理解 .NET 中的表达式树
我已经阅读了几篇关于表达式树的文章和几个stackoverflow.com帖子。它在跳动我的大脑来理解。
问题:
1)像DOM(文档对象模型)一样,它是逻辑的内存表示?
2)有人解释说这是一种将可执行代码转换为数据的机制,使用它我们可以生成表示代码的数据结构。
这是否意味着,表达式树用于设计用户定义的模式?
3)大多数示例显示表达式树与Func<>
委托或其他委托一起使用,因此使用委托和其他编程结构不能实现与表达式树相同的事情。
初学者可以理解的解释受到高度赞赏。
c# - 重构函数进入表达>
我有一个当前将 aFunc<Product, string>
作为参数的方法,但我需要它是一个Expression<Func<Product, string>>
. 使用 AdventureWorks,这是我想使用 Func 做的一个示例。
我希望它看起来像这样:
但是,我遇到的问题myExpression(product)
是无效的(不会编译)。在阅读了其他一些帖子后,我明白了为什么。如果不是因为我需要product
密钥的第二部分的变量,我可能会这样说:
但我确实需要该product
变量,因为我确实需要密钥的第二部分(ProductNumber)。所以我不确定现在该怎么做。我不能将其保留为 Func,因为这会导致问题。我不知道如何使用表达式,因为我看不到如何将product
变量传递给它。有任何想法吗?
编辑:这是我如何调用该方法的示例:
c# - 从属性中检索表达式并将其添加到表达式树
我试图简化这个例子,因为我正在使用的实际代码更复杂。因此,虽然这个例子可能看起来很愚蠢,但请耐心等待。假设我正在使用 AdventureWorks 数据库,并且我决定添加一个名为的属性,该属性返回一个包含我想在多个地方使用的代码的表达式Blarg
的表:Product
我想要做的是创建一个表达式表达式树,让它从 Product.Blarg 中获取表达式,并按结果分组。像这样的东西:
显然groupExpression
是不正确的(见异常代码注释),但我不知道我应该怎么做。我以为我在说的是“从 中获取表达式product.Blarg
,执行它,然后返回字符串结果。” 不过,我想这不是我实际上要说的。我仍在尝试找出表达式树。知道我怎么能做到这一点吗?
c# - 从 MemberExpression 中获取对象?
所以,假设我在 C# 中有以下表达式:
如何提取对 foo 的引用?
.net - 将 .NET 表达式树链接到新程序集
我正在尝试编写自己的玩具 My Toy Language -> MSIL 编译器,以便更好地了解编译器的工作原理。我得到了解析和词法分析工作,我已经构建了表达式树并使用 System.Linq.Expressions 表达式树 API,我有一个工作解释器。现在我想发出一些真正的 MSIL 程序集。
问题是,我不知道如何实际构建这些程序集。MethodBuilder类只接受原始 MSIL 方法体,因此我必须获取表达式树的原始 MSIL。调用Expression.Compile()返回一个工作委托,但我无法获得它的底层 MSIL。调用MethodInfo.GetMethodBody()会引发 InvalidOperationException,因为它未在该特定子类中实现。
如何将该委托链接到新程序集?
.net - 在 DLR 中避免不必要的装箱
我正在玩 DLR 以更好地理解它。我还不完全熟悉它的所有概念和术语,因此对我的问题中的任何术语或概念错误感到抱歉。
基本上,我理解的方式是在表达式树中传递对象,但使用绑定器将对象的动态功能公开给其他支持 DLR 的语言。因此,不是直接在表达式树中进行添加(例如,使用 Expression.Add),而是创建一个绑定器,调用站点在需要时调用该绑定器并为您执行添加。
但是,由于您传递对象,因此在加法操作结束时(例如,如果操作数是两个 Int32 值),您将不得不将生成的 Int32 装箱到一个对象,因为(仍在活页夹中)调用什么网站预计。我有点担心这种不断的装箱/拆箱可能会在一定程度上影响运行时的性能。
这真的是它应该如何工作(所有装箱/拆箱)还是我错过了什么?
c# - 多项式评估的生成方法
我试图想出一种优雅的方式来处理一些生成的多项式。这是我们将(专门)针对这个问题关注的情况:
- order是生成n阶多项式的参数,其中 n:=order + 1。
- i是 0..n 范围内的整数参数
- 多项式在 x_j 处为零,其中 j = 1..n 且 j ≠ i(此时应该清楚 StackOverflow 需要一个新功能,或者它存在但我不知道)
- 多项式在 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 来重写最终答案而不需要调用。
为了做所有这些“诡计”(所有非常基本的代数),我需要一种干净的方法来:
- 展开一个因式
Expression
包含ConstantExpression
、ParameterExpression
叶子和基本的数学运算(以运算BinaryExpression
的NodeType
集合结束)——这里的结果可以包括我们将在整个过程中以特殊方式处理的元素InvocationExpression
。MethodInfo
Math.Pow
- 然后我对一些指定的
ParameterExpression
. 结果中调用 的右侧参数为Math.Pow
常数 2 的项被替换为ConstantExpression(2)
乘以左侧的Math.Pow(x,1)
值(删除了 的调用)。结果中的项因相对于 x 为常数而变为零。 - 然后将某些特定的实例
ParameterExpression
分解为调用的左侧参数Math.Pow
。当调用的右侧变成ConstantExpression
带有 value的 a 时1
,我们将调用替换为ParameterExpression
本身。
¹将来,我希望该方法采用 aParameterExpression
并返回Expression
基于该参数进行评估的 an 。这样我就可以聚合生成的函数。我还没到。² 将来,我希望发布一个通用库,用于将 LINQ 表达式用作符号数学。