gpt4 book ai didi

c# - 如何创建 `ExpressionType.IsTrue/IsFalse` ?

转载 作者:太空狗 更新时间:2023-10-30 01:30:49 25 4
gpt4 key购买 nike

长话短说

如何创建一个表达式,其中

Expression.NodeType == ExpresionType.IsTrue || ExpresionType.IsFalse

背景信息

我正在创建 EnumerableQuery 的自定义版本,我在其中重写所有表达式以处理 Null 检查。因此,当将 EF Linq2Sql 代码作为 Linq2Objects 进行单元测试时,访问的 null 导航属性不会引发异常,而是优雅地处理它。

我正在尝试为所有 ExpressionType 成员实现测试。如何创建表达式语法来创建 ExpressionType.IsTrueExpressionType.IsFalse 节点。

Github Project: Moqqer

尝试 1.x => x

Where 子句:

queryable.Where(x => x.L1.L2.L3.L4.L5.Boolean);

返回

ExpressionType.MemberAccess

尝试 2.x => !(x && y)

以下 Where 子句:

queryable.Where(x => !(x.L1.L2.L3.L4.L5.Boolean && x.L1.L2.L3.L4.L5.Boolean));

返回

ExpressionType.Not
ExpressionType.AndAlso
Left = ExpressionType.MemberAccess
Right = ExpressionType.MemberAccess

尝试 3.x => true

Where 子句

queryable.Where(x => true);

返回

ExpressionType.Constant

评论

我猜这些 ExpressionType 仅在手动创建表达式树时使用,并希望返回类似于 ExpressionType.Constant(true) 但更少的表达式开销?

最佳答案

据我所知,ExpressionType.IsTrueExpressionType.IsFalse 代表一元运算符 truefalse分别。它们不是常量 bool 值的“低开销”替代品。

就是说,我无法获得“自动”创建这些节点之一的表达式。编译器将简单地发出对 op_true 的调用,它显示为 ExpressionType.Call。所以看起来它在手动构建表达式树时真的出现了。事实上,您可以通过调用 Expression.IsTrue( Expression e ) 来创建此类型.

关于c# - 如何创建 `ExpressionType.IsTrue/IsFalse` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42875376/

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