gpt4 book ai didi

linq - LINQ 的 Expression.Quote 方法的目的是什么?

转载 作者:行者123 更新时间:2023-12-01 15:54:37 25 4
gpt4 key购买 nike

MSDN 文档指出:

Expression.Quote

Method Creates a UnaryExpression that represents an expression that has a constant value of type Expression.



我已经能够通过使用 Expression 类手动构建谓词表达式来构建用于 LINQ 查询的谓词表达式,但从未遇到过对 Expression.Quote 的需求。

你什么时候以及为什么会使用它?从我看到的 LINQ 表达式来看,它们似乎只是包装了现有的表达式而没有添加任何值。

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

最佳答案

Expression.Quote指定将 lambda 视为表达式树而不是函数。它在其操作数上引入闭包语义。

当您构建 MethodCallExpression 时使用 Expression.Call ,任何 lambda 表达式参数 ( LambdaExpression/Expression<TDelegate> ) 必须使用 Expression.Quote在传入之前包装参数。

所以对于 Expression<Func<bool>> 类型的参数,当您创建一个实例时,例如:() => true , 表达式的 Type属性将是 Func<bool>而表达式的类型(调用 GetType )将是 Expression<Func<bool>>
所以要得到一个 Expression具有 Type 的正确值您将 lambda 表达式传递给 Expression.Quote 的属性并将其作为参数传递给 Expression.Call .

我看了Expression.Quote通过反射器,而唯一的参数类型是 Expression ,它必须来自 LambdaExpression这是在方法中检查的。出于兴趣,任何人都知道为什么 MS 不只是将参数类型设为 LambdaExpression ?

正如 StevenH 指出的那样,Expression.Quote用于实现 LINQ 查询提供程序。 Queryable上的所有方法使用 lambda 表达式,例如 Where , OrderBy , GroupBy等内部构造一个 MethodCallExpression使用 Expression.Call并用 Expression.Quote 包裹 lambda 表达式参数调用。

更详细的解释Expression.Quote阅读本文 answer .

关于linq - LINQ 的 Expression.Quote 方法的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3138133/

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