Практическое руководство. Выполнение деревьев выражений (C# и Visual Basic)

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

Можно выполнять только деревья выражений, представляющих лямбда-выражения. Деревья выражений, представляющие лямбда-выражения, имеют тип 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.

См. также

Задачи

Практическое руководство. Изменение деревьев выражений (C# и Visual Basic)

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

Деревья выражений (C# и Visual Basic)