表达式树发出运行时代码
本文关键字:运行时 代码 表达式 | 更新日期: 2023-09-27 18:25:50
当您在运行时构建表达式树时,没有代码发射。这是在运行时表示.NET代码的一种方式。。。
好的。。。
现在假设我有这个代码:
ParameterExpression p = Expression.Parameter (typeof (string), "s");
MemberExpression stringLength = Expression.Property (p, "Length");
ConstantExpression five = Expression.Constant (5);
BinaryExpression comparison = Expression.LessThan (stringLength, five);
Expression<Func<string, bool>> lambda= Expression.Lambda<Func<string, bool>> (comparison, p);
Func<string, bool> runnable = lambda.Compile();
这个代码不会在IL吗?当然会的!(也许最后一行在编译之前不会发出代码…但我认为第一行会发出代码!)
那么我在这里省了什么?
好的,所以前5行确实发出了代码,最后一行没有。。。了不起的事
我错过了什么?你能让我看看全貌吗?
使用表达式树,可以构建一些代码的描述,而不是代码本身。表达式树不应用于编写"不应在编译时编译"的正则代码的上下文中。它们应该用于更动态的场景。
显示的表达式树将编译为:s.Length < 5
,并使用bool isStringSmallerThan5 = runnable("MyString")
调用runnable
。
表达式树的全部思想是,它们描述一些代码,并且可以在运行时编译。这意味着您可以执行以下操作:
BinaryExpression comparison = null;
if (lessThen)
{
comparison = Expression.LessThan(stringLength, five);
}
else
{
comparison = Expression.GreaterThan(stringLength, five);
}
现在您可以在运行时更改代码的行为了!
表达式树的最大用途是它们可以由提供者进行解释。例如,Linq-To-Entities使用表达式树,并将它们编译为可以针对数据库运行的SQL代码。LinqToXml是您可以使用表达式树执行的另一个示例。
这是一篇很好的博客文章,让你开始。
表达式树在方法中接收它们时非常有用,因为它们使您能够更复杂地使用表达式内容。如果在方法中接收到谓词,则可以针对目标运行它并检查结果。如果你收到表示表达式树的表达式树,你可以解析它并用它做一些有用的事情。一个例子是LINQ,它利用了这么多地方,但在"Where"-方法中有一个。捕获表达式树而不是IL可以相对直接地转换为SQL,而不仅仅是执行完整的"Select"并针对具体化的结果运行谓词。