【问题标题】:How to create `ExpressionType.IsTrue/IsFalse`?如何创建“ExpressionType.IsTrue/IsFalse”?
【发布时间】:2017-03-18 14:06:20
【问题描述】:

TL;DR

如何在哪里创建Expression

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 => 真

Where 子句

queryable.Where(x => true);

返回

ExpressionType.Constant

评论

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

【问题讨论】:

    标签: c# .net compilation expression linq-expressions


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-31
      • 2016-07-10
      • 2022-01-11
      • 2011-04-02
      • 2016-03-11
      • 2014-09-15
      • 2018-12-08
      • 2019-03-06
      相关资源
      最近更新 更多