Ответ
Expression
Основные сценарии использования:
- ORM и запросы к БД (например, Entity Framework): LINQ-запросы преобразуются в SQL через анализ дерева выражений.
- Динамическая компиляция с высокой производительностью: Компиляция выражения в делегат (
Compile()) для быстрого доступа к свойствам или вызова методов, что значительно быстрее рефлексии. - Построение динамических фильтров и правил: Создание сложных предикатов (
Where) на лету.
Пример:
// Создаем выражение как данные, а не исполняемый код
Expression<Func<int, int, int>> addExpression = (a, b) => a + b;
// Анализируем его структуру
BinaryExpression body = (BinaryExpression)addExpression.Body;
Console.WriteLine(body.NodeType); // Выведет: Add
// Компилируем в быстрый делегат для выполнения
Func<int, int, int> compiledDelegate = addExpression.Compile();
int result = compiledDelegate(5, 3); // result = 8
Ключевое отличие от обычной лямбды (Func<int, int, int>): Лямбда-выражение, присвоенное Expression, не выполняется сразу — оно сохраняется как структура данных для последующего анализа.