问题标签 [expressionvisitor]
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.
c# - 由于关闭而将实际值包装到 DisplayClass 中时获取 ConstantExpression.Value
下面是我的问题的简单演示代码。
TestParam
方法导致VisitConstant
在两个不同的路径上调用:
1 TestParam
.-> Search
->VisitConstant
在这个执行路径中,传递给Search
方法的常量表达式 (1L) 是一个实常量值。到这里,一切正常,assert按预期成功。当VisitConstant
通过第一个路径调用时node.Value.GetType()
isInt64
和它的.Value
is 1L
。
2 TestParam
.-> GetStudent
-> Search
->VisitConstant
在这个执行路径常量表达式 (id: 1L) 中,GetStudent
作为参数并传递给Search
闭包内的方法。
问题
问题出在第二条执行路径上。当VisitConstant
通过第二条路径调用node.Value.GetType()
时MyProject.Tests.ExpressionTests+<>c__DisplayClass0
,该类有一个名为id
(与GetStudent
方法的参数相同)的公共字段,其值为1L
.
问题
如何id
在第二条路径中获得价值?我知道闭包,什么是 aDisplayClass
以及为什么在编译时创建它等。我只对获取它的字段值感兴趣。我能想到的一件事是,通过反射。像下面这样的东西,但它看起来并不整洁。
奖金问题
在使用获取id
值的代码时,我更改了VisitConstant
如下方法(但这不会解决我的问题)并得到一个异常说“'object'不包含'id'的定义”
奖金问题
由于动态是在运行时解析并DisplayClass
在编译时创建的,为什么我们不能使用 访问它的字段dynamic
?虽然下面的代码可以工作,但我希望该代码也可以工作。
c# - 参数为复杂对象时的参数替换
我正在尝试创建一个AndAlso
将在查询Where
方法中使用的动态过滤器:LINQ-to-EF
filterExpression
编译的 lambda在哪里
到目前为止,我已经实现了一个带有一些奇特用法的循环来检查只有一个、两个或多个查询的情况。
然后我设置了一个ParameterReplacer
以确保我的表达式参数的所有迭代都获得相同的引用:
它是由:
(ParameterReplacer
课程由JonSkeet提供)
运行时出现ParameterReplacer
以下错误:
其中FileColumnRecords
定义为:
并且FileColumnValues
作为:
c# - If Participating in Queryable c# join
Looking for ways to find participation in queryable Joins...
Basically, I want to check if model class X is used in join operations in Queryable statements. Using David Fowl's QueryInterceptor I can put an expression visitor on an IQueryable. Then check for Lambda expressions (looks like joins are represented with them generally) for parameters with a type of class X. The visitor can toggle a flag for a hit.
Other ways? Again, I am only interested in if class X is involved in joins.
linq - 如何使用 ExpressionVisitor 从 ExpressionTree 中删除 OrderBy 表达式?
Azure 表存储 linq 提供程序不支持 Orderby 语句我有一个类似的表达式
我正在尝试.OrderBy(user => user.UserName)
从表达式树中删除
我还希望访问者从以下表达式中删除 orderby 语句
会变成
c# - System.Linq.Expressions.ExpressionVisitor.VisitExtension 和 System.Linq.Expressions.ExpressionType.Extension 有什么用?
System.Linq.Expressions.ExpressionVisitor
有一个名为的方法,除了调用被访问的方法VisitExtension
外,它似乎什么也不做。VisitChildren
Expression
我明白它的VisitChildren
作用。我也明白这个虚拟实现可以并且可能意味着被覆盖。因此,我从MSDN 上的方法文档中收集了一些信息,并简要说明了这一点:
访问扩展表达式的子级。这可以被覆盖以访问或重写特定的扩展节点。如果它没有被覆盖,这个方法将调用 VisitChildren,这让节点有机会遍历它的子节点。默认情况下,VisitChildren 将尝试减少节点。
我觉得这个解释没有帮助。具体来说,让我无法理解的短语是“或重写特定的扩展节点”。
我理解它的其余部分,这与将表达式简化或分解为子表达式有关。
在同一个命名空间中还有一个名为 的枚举ExpressionType
,我非常了解它的目的。但是在它的所有成员中,有一个名为Extension
我无法映射到我目前知道的任何语法标记的成员。
本例中的文档也非常简洁。它描述的值Extension
如下:
扩展表达式。
很明显,这两者 -ExpressionType.Extension
和ExpressionVisitor.VisitExtension
- 是相关的。
但是什么是扩展?当然,正如显而易见的那样,扩展方法在这种情况下没有地位。表达式扩展在这里指的是哪个语法工件?
c# - 如何使用 ExpressionVisitor 更改表达式,添加更多属性?
我有一个具有两个属性的表达式,我需要在运行时更改此表达式以添加更多项目。
在将 query1 传递给访问者之后,我希望返回给我一个表达式:
结果时BarCode
,需要返回一个默认值,例如:string.Empty
我该怎么做?我在互联网上搜索了任何示例,但一无所获。
c# - 从现有表达式在父对象上创建表达式树以进行 c# mongodb 驱动程序解析
我有这样的课:
我还有另一个通用类,例如:
例如,我有一个这样的表达式:
如何将此表达式转换为:
编辑 :
我认为我的问题还不够完善,我想要这样的方法:
编辑 :
我必须创建一个新的树表达式,然后由 c# mongodb 驱动程序解析。我不能在表达式树上使用 Invoke an other Compile 方法。
我想我必须使用ExpressionVisitor但我不知道如何......
c# - 为什么不抛出表达式树中最里面的异常?
我一直在尝试创建一个自定义ExpressionVisitor
,该自定义会生成一个(可选)NullReferenceException
在第一个null
值上抛出 a 的表达式。表达式的DebugView
对我来说看起来不错,但它不能作为 exptecte (由我)工作。我以为它会首先抛出
因为测试变量是null
但是这个变量被抛出
我不明白为什么它会向后执行语句。它不应该If
先执行最里面的吗?
调试视图:
我的完整测试代码:
c# - 按类型从表达式中提取所有条件
给定一个Expression<Func<TEntity, bool>>
沿着
我正在尝试按类型提取列表属性条件,即
到目前为止,我已经创建了一个方法ExpressionVisitor
并将该方法标识VisitBinary
为我想要插入的方法以获取我的信息。
我仍然不知所措
- 如何确定
BinaryExpression
我正在查看的是否代表终端语句(在某种意义上,我不需要查看更多嵌套表达式) - 如何确定所
BinaryExpression
关心的实体类型 - 我是否需要覆盖任何其他
ExpressionVisitor
方法来涵盖我尚未考虑的情况。
c# - ExpressionVisitor 没有调用它的 VisitMethodCall
我正在关注MSDN 上的一个示例系列,用于创建 LINQ 提供程序并且已经碰壁了。
我期望当我编写以下测试时,下面ExpressionVisitor
的源代码中的子类会VisitMethodCall
被调用。
相反,会发生该VisitConstant
方法被调用。我认为这是因为当Provider
实例化时,它分配了它的Expression
属性 a ConstantExpression
。我不确定我是否做错了什么,或者 MSDN 上的指南是否存在问题,阻止我获取包含Where
方法调用的表达式。
IQueryable<T>
这是我拥有的和IQueryProvider
实现的源代码。
编辑
更新了我的单元测试以实际存储IQueryable
from .Where
,我仍然没有看到我的VisitMethodCall
调用。