代码之家  ›  专栏  ›  技术社区  ›  John Mills

Linq的expression.Quote方法的目的是什么?

  •  41
  • John Mills  · 技术社区  · 15 年前

    MSDN文档说明:

    表达式.引号

    方法创建 表示一个 具有常量值的表达式 类型表达式的。

    I've been able to build predicate expressions for use in LINQ queries by manually constructing them using the Expression class, but have never come across the need for Expression.Quote.

    你什么时候为什么要用这个?从我看到的拥有它们的Linq表达式来看,它们似乎只是包装现有表达式而不添加任何值。

    报价方法/节点类型的目的是什么?

    1 回复  |  直到 11 年前
        1
  •  25
  •   Community CDub    8 年前

    Expression.Quote specifies that a lambda is to be treated as an expression tree and not as a function. It induces closure semantics on its operand.

    当您正在构造 MethodCallExpression 使用 Expression.Call ,是lambda表达式的任何参数( LambdaExpression / Expression<TDelegate> )必须使用 表达式.引号 在传入之前包装参数。

    所以对于一个类型的参数 Expression<Func<bool>> ,创建实例时,例如: () => true ,表达式的 Type 财产将是 Func<bool> 而表达式的类型(调用 GetType 将是 表达式<func<bool>>

    所以得到一个 Expression 具有正确的 类型 传递lambda表达式到的属性 表达式.引号 把它作为参数传递给 调用表达式 .

    我看了看。 表达式.引号 通过反射镜,而唯一的参数是类型 表情 ,它必须从 LambdaExpression语言 and this is checked inside the method. Out of interest, anyone know why MS didn't just make the parameter type be LambdaExpression语言 ?

    正如史蒂文指出的, 表达式.引号 用于实现Linq查询提供程序。所有方法 Queryable 采用lambda表达式,例如 Where , OrderBy , GroupBy 等内部构造 方法调用表达式 使用 调用表达式 并用换行符包装lambda表达式参数 表达式.引号 电话。

    更详细的解释 表达式.引号 读这个 answer .