Построение выражений вручную
Создавайте деревья выражений с помощью API Expression.
«Построение выражений вручную» — бесплатный урок C# Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 4 уроков всего.
Построение деревьев вручную
Помимо автоматического построения дерева компилятором из лямбды, Вы можете создать дерево самостоятельно с помощью статических фабричных методов Expression.
using System;
using System.Linq.Expressions;
var five = Expression.Constant(5);
Console.WriteLine(five); // 5
Console.WriteLine(five.Type); // System.Int32Expression.Parameter
Expression.Parameter(type, name) создаёт узел параметра, на который можно ссылаться в теле и который можно связать с лямбдой.
using System;
using System.Linq.Expressions;
var x = Expression.Parameter(typeof(int), "x");
Console.WriteLine(x.Name + " : " + x.Type); // x : System.Int32Expression.Constant
Expression.Constant(value) встраивает литеральное значение. При необходимости можно указать его тип.
using System;
using System.Linq.Expressions;
var c = Expression.Constant(42);
var typed = Expression.Constant(3.14, typeof(double));
Console.WriteLine(c + " " + typed); // 42 3.14Expression.Add
Для двоичных операторов существуют фабрики, например Expression.Add. Они принимают два выражения-операнда и создают объект BinaryExpression.
using System;
using System.Linq.Expressions;
var x = Expression.Parameter(typeof(int), "x");
var sum = Expression.Add(x, Expression.Constant(1));
Console.WriteLine(sum); // (x + 1)Другие двоичные операторы
Существуют фабрики для полного набора операций: Subtract, Multiply, Divide, GreaterThan, Equal и других.
using System;
using System.Linq.Expressions;
var x = Expression.Parameter(typeof(int), "x");
var gt = Expression.GreaterThan(x, Expression.Constant(10));
var mul = Expression.Multiply(x, Expression.Constant(2));
Console.WriteLine(gt + " | " + mul); // (x > 10) | (x * 2)Обёртывание в лямбду
Expression.Lambda объединяет тело и параметры в объект Expression<TDelegate>, который позже можно скомпилировать.
using System;
using System.Linq.Expressions;
var x = Expression.Parameter(typeof(int), "x");
var body = Expression.Add(x, Expression.Constant(1));
var lambda = Expression.Lambda<Func<int, int>>(body, x);
Console.WriteLine(lambda); // x => (x + 1)Объединение вложенных выражений
Фабрики можно свободно вкладывать, поэтому Вы можете пошагово создавать сложные выражения, например (x + 1) * 2.
using System;
using System.Linq.Expressions;
var x = Expression.Parameter(typeof(int), "x");
var addOne = Expression.Add(x, Expression.Constant(1));
var timesTwo = Expression.Multiply(addOne, Expression.Constant(2));
Console.WriteLine(timesTwo); // ((x + 1) * 2)Доступ к членам
Expression.Property и Expression.Field создают узлы доступа к членам.
using System;
using System.Linq.Expressions;
var s = Expression.Parameter(typeof(string), "s");
var lengthAccess = Expression.Property(s, "Length");
Console.WriteLine(lengthAccess); // s.LengthВызовы методов
Expression.Call создаёт узел вызова, получая целевой объект, метод и аргументы.
using System;
using System.Linq.Expressions;
var s = Expression.Parameter(typeof(string), "s");
var toUpper = typeof(string).GetMethod("ToUpper", Type.EmptyTypes);
var call = Expression.Call(s, toUpper);
Console.WriteLine(call); // s.ToUpper()Проверка типов во время построения
Фабрики проверяют типы операндов во время построения. Несовпадение типов сразу вызывает исключение, что позволяет обнаружить ошибки на раннем этапе.
using System;
using System.Linq.Expressions;
try {
var bad = Expression.Add(
Expression.Constant(1),
Expression.Constant("text")); // int + string
} catch (InvalidOperationException) {
Console.WriteLine("type mismatch rejected");
}Объединение всех элементов
Полностью вручную постройте лямбду x => (x + 1) * 2.
using System;
using System.Linq.Expressions;
var x = Expression.Parameter(typeof(int), "x");
var body = Expression.Multiply(
Expression.Add(x, Expression.Constant(1)),
Expression.Constant(2));
var lambda = Expression.Lambda<Func<int, int>>(body, x);
Console.WriteLine(lambda); // x => ((x + 1) * 2)Быстрая проверка
Убедитесь, что понимаете, как вручную строятся выражения.
Повторение
Вы научились вручную строить деревья выражений.
Expression.ParameterиExpression.Constantсоздают листовые узлы.Expression.Addи подобные методы строят двоичные операции.Expression.PropertyиExpression.Callработают с членами и методами.Expression.Lambdaсобирает вызываемое дерево.
Часто задаваемые вопросы
Урок «Построение выражений вручную» бесплатный?
Да — полный текст урока «Построение выражений вручную» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 4 уроков всего.
Чему я научусь в уроке «Построение выражений вручную»?
Создавайте деревья выражений с помощью API Expression. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C# Academy?
Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Построение выражений вручную»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C# Academy?
Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Что такое деревья выражений
- Построение выражений вручную
- Компиляция и выполнение выражений
- Деревья выражений в поставщиках LINQ