Практическое руководство. Выполнение деревьев выражений
Обновлен: Ноябрь 2007
В этом разделе показано, как выполнить дерево выражения. В результате выполнения дерева выражения может возвращаться значение или просто выполняться действие, такое как вызов метода.
Можно выполнять только деревья выражений, представляющих лямбда-выражения. Деревья выражений, представляющие лямбда-выражения, имеют тип LambdaExpression или Expression<TDelegate>. Для выполнения таких деревьев выражений вызовите метод Compile, чтобы создать исполняемый делегат, а затем запустите делегат.
Примечание. |
---|
Если тип делегата неизвестен, то есть лямбда-выражение имеет тип LambdaExpression и не является Expression<TDelegate>, необходимо вызвать для делегата метод DynamicInvoke, а не вызывать делегат непосредственно. |
Если дерево выражения не представляет лямбда-выражение, можно создать новое лямбда-выражение, телом которого будет исходное дерево выражения, вызвав метод Lambda<TDelegate>(Expression, IEnumerable<ParameterExpression>). Затем можно выполнить лямбда-выражение, как описано ранее в этом разделе.
Пример
В следующем примере кода показано, как путем создания и выполнения лямбда-выражения выполнить дерево выражения, которое представляет возведение числа в степень. Выводится результат, представляющий число, возведенное в степень.
' The expression tree to execute.
Dim be As BinaryExpression = Expression.Power(Expression.Constant(2.0R), Expression.Constant(3.0R))
' Create a lambda expression.
Dim le As Expression(Of Func(Of Double)) = Expression.Lambda(Of Func(Of Double))(be)
' Compile the lambda expression.
Dim compiledExpression As Func(Of Double) = le.Compile()
' Execute the lambda expression.
Dim result As Double = compiledExpression()
' Display the result.
MsgBox(result)
' This code produces the following output:
' 8
// The expression tree to execute.
BinaryExpression be = Expression.Power(Expression.Constant(2D), Expression.Constant(3D));
// Create a lambda expression.
Expression<Func<double>> le = Expression.Lambda<Func<double>>(be);
// Compile the lambda expression.
Func<double> compiledExpression = le.Compile();
// Execute the lambda expression.
double result = compiledExpression();
// Display the result.
Console.WriteLine(result);
// This code produces the following output:
// 8
Компиляция кода
Добавьте в проект ссылку на библиотеку System.Core.dll, если такая ссылка отсутствует.
Включите пространство имен System.Linq.Expressions.
См. также
Задачи
Практическое руководство. Изменение деревьев выражений