0Pricing
C# Academy · Урок

Построение выражений вручную

Создавайте деревья выражений с помощью 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.Int32

Expression.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.Int32

Expression.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.14

Expression.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 — локальная установка не требуется.

Все уроки этого курса

  1. Что такое деревья выражений
  2. Построение выражений вручную
  3. Компиляция и выполнение выражений
  4. Деревья выражений в поставщиках LINQ
← Назад к C# Academy