【发布时间】:2018-09-29 19:17:05
【问题描述】:
使用 LINQ 表达式时,C# 编译器会方便地将 C# lambda 转换为 Expression 对象:
//using System;
//using System.Linq.Expressions;
Expression<Func<int, bool>> lambda_expression = (int x) => x == 3;
这很方便,与显式构造表达式相比,可以节省大量输入:
Expression<Func<int, bool>> explicit_expression_object;
{
var x = Expression.Parameter(typeof(int), "x");
explicit_expression =
Expression.Lambda<Func<int, bool>>(Expression.Equal(x, Expression.Constant(3)), x);
}
但是,在某些情况下,需要使用“普通”表达式对象语法,例如在运行时动态创建表达式时。因此,我目前发现自己混合使用“表达式 lambda”和动态生成的“显式”表达式对象。
是否可以将 Expression 对象“包含”或“嵌入”到表达式 lambda 中?
例如:
Expression inner_expression_object = Expression.Constant(3);
Expression<Func<int, bool>> wrapper_expression =
(int x) => x == inner_expression_object.Embed();
【问题讨论】:
-
看看这个(堆栈溢出)答案stackoverflow.com/a/24403382/9204431>
-
Related, almost a duplicate。剧透:不,你必须手动组合它们。
-
您可以为此写一个
ExpressionVisitor,类似LINQKit用于查询。 -
请注意,
Embed无法知道正确的类型,所以我认为您需要Embed<T>才能工作。 -
虽然如果有提供返回类型的
Expression对象的通用变体会很好。
标签: c# linq lambda linq-expressions