Для получения исполняемой формы дерева выражений достаточно вызвать методCompile (), определенный в классеExpression.Этот метод возвращает ссылку, которая может быть присвоена делегату для последующего выполнения. А тип делегата может быть объявлен собственным или же одним из предопределенных типов делегатаFuncв пространстве именSystem.Две формы делегатаFuncуже упоминались ранее при рассмотрении методов запроса, но существует и другие его формы.

Деревьям выражений присуще следующее существенное ограничение: они могут представлять только одиночные лямбда-выражения. С их помощью нельзя представить блочные лямбда-выражения.

Ниже приведен пример программы, демонстрирующий конкретное применение дерева выражений. В этой программе сначала создается дерево выражений, данные которого представляют метод, определяющий, является ли одно целое число множителем другого. Затем это дерево выражений компилируется в исполняемый код. И наконец, в этой программе демонстрируется выполнение скомпилированного кода.

// Пример простого дерева выражений.

using System;

using System.Linq;

using System.Linq.Expressions;

class SimpleExpTree { static void Main() {

// Представить лямбда-выражение в виде данных.

Expression

IsFactorExp = (n, d) => (d != 0) ? (n % d) ==0 : false;

// Скомпилировать данные выражения в исполняемый код.

Func IsFactor = IsFactorExp.Compile ();

// Выполнить выражение, if(IsFactor(10, 5))

Console.WriteLine("Число 5 является множителем 10.");

if(!IsFactor(10, 7))

Console.WriteLine("Число 7 не является множителем 10.");

Console.WriteLine ();

}

}

Вот к какому результату приводит выполнение этой программы.

Число 5 является множителем 10.

Число 7 не является множителем 10.

Данный пример программы наглядно показывает два основных этапа применения дерева выражений. Сначала в ней создается дерево выражений с помощью следующего оператора.

Expression

IsFactorExp = (n, d) => (d != 0) ? (n % d) ==0 : false;

В этом операторе конструируется представление лямбда-выражения в оперативной памяти. Как пояснялось выше, это представление доступно по ссылке, присваиваемой делегатуIsFactorExp.А в следующем операторе данные выражения преобразуются в исполняемый код.

Func IsFactor = IsFactorExp.Compile();

После выполнения этого оператора делегатIsFactorExpможет быть вызван, чтобы определить, является ли одно целое число множителем другого.

Перейти на страницу:

Похожие книги