Поделиться через


Практическое руководство. Выполнение деревьев выражений

Обновлен: Ноябрь 2007

В этом разделе показано, как выполнить дерево выражения. В результате выполнения дерева выражения может возвращаться значение или просто выполняться действие, такое как вызов метода.

Можно выполнять только деревья выражений, представляющих лямбда-выражения. Деревья выражений, представляющие лямбда-выражения, имеют тип LambdaExpression или Expression<TDelegate>. Для выполнения таких деревьев выражений вызовите метод Compile, чтобы создать исполняемый делегат, а затем запустите делегат.

Bb882536.alert_note(ru-ru,VS.90).gifПримечание.

Если тип делегата неизвестен, то есть лямбда-выражение имеет тип 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.

См. также

Задачи

Практическое руководство. Изменение деревьев выражений

Основные понятия

Деревья выражений