表达式树发出运行时代码

本文关键字:运行时 代码 表达式 | 更新日期: 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"并针对具体化的结果运行谓词。