Прежде чем начать с Expression Trees, давайте сначала разберемся с Expression в .NET.

В .NET Expression — это абстрактный класс, который содержит статические методы и наследуется различными типами (такими как ParameterExpression, MethodCallExpression, BinaryExpression и т. д.) для создания узлов дерева выражений определенных типов. Кроме того, все эти типы дерева выражений, специфичные для выражений, определены в пространстве имен System.Linq.Expressions.

Деревья выражений были впервые представлены в C# 3.0 (Visual Studio 2008), где они в основном использовались поставщиками LINQ. Чтобы узнать больше о функциях C# в отношении его версии, обратитесь к сообщению ниже.

Список функций C# по версии

Что такое деревья выражений в C#?

Деревья выражений представляют код в древовидном формате, где каждый узел представляет собой выражение (например, вызов метода или двоичную операцию, такую ​​как x ‹ y).

Вы также можете преобразовать деревья выражений в скомпилированный код и запустить его. Это преобразование обеспечивает динамическую модификацию исполняемого кода, а также выполнение запросов LINQ в различных базах данных и создание динамических запросов.

Деревья выражений в C# 3.0 #expressiontree #csharp Click To Tweet

Деревья выражений можно создать двумя способами:

  • Использование лямбда-выражения
  • Использование API дерева выражений

1. Использование лямбда-выражения

Самый простой способ сгенерировать дерево выражений — создать экземпляр типа Expression<T>, где T — тип делегата, и присвоить этому экземпляру лямбда-выражение.

// Create an expression using expression lambda Expression<Func<int, int, int>> expression = (num1, num2) => num1 + num2; // Compile the expression Func<int, int, int> compiledExpression = expression.Compile(); // Execute the expression. int result = compiledExpression(3, 4); //return 7

В этом примере компилятор C# создает дерево выражения из предоставленного лямбда-выражения. Это выглядит намного сложнее, но на самом деле это происходит, когда вы предоставляете лямбда-выражение дереву выражений.

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

2. Использование API дерева выражений

Класс Expression используется для создания деревьев выражений с помощью API. В .NET Framework 4 API деревьев выражений также поддерживает присваивания и выражения потока управления, такие как циклы, условные блоки и блоки try-catch. Используя API, вы можете создавать более сложные деревья выражений, чем те, которые можно создать из лямбда-выражений. Используя API, приведенный выше код можно переписать как:

//Create the expression parameters ParameterExpression num1 = Expression.Parameter(typeof(int), "num1"); ParameterExpression num2 = Expression.Parameter(typeof(int), "num2"); //Create the expression parameters ParameterExpression[] parameters = new ParameterExpression[] { num1, num2 }; //Create the expression body BinaryExpression body = Expression.Add(num1, num2);</pre> //Create the expression Expression<Func<int, int, int>> expression = Expression.Lambda<Func<int, int, int>>(body, parameters); // Compile the expression Func<int, int, int> compiledExpression = expression.Compile(); // Execute the expression int result = compiledExpression(3, 4); //return 7

Структура дерева выражений

Простая структура Expression<TDelegate> имеет четыре свойства, как указано ниже:

  1. Тело: Тело выражения.
  2. Параметры: параметры лямбда-выражения.
  3. NodeType: тип узла в дереве.
  4. Тип: Тип выражения

Спасибо за чтение и дайте мне знать ваши ценные комментарии, если таковые имеются.

Нравится этот пост? Не забудьте поделиться!

Это гостевой пост пользователя Sanskriti. Если вы хотите написать для DotnetCrunch, ознакомьтесь с нашими правилами гостевых публикаций.

Что вы думаете?

Уважаемые читатели,
Если у вас есть какие-либо вопросы или предложения, пожалуйста, напишите нам по электронной почте или поделитесь своими мыслями в комментариях ниже. Мы были бы рады получить известия от вас. Если вы нашли этот пост или статью полезной, поделитесь ею с друзьями и помогите им научиться.

Удачного программирования!

Первоначально опубликовано на сайте dotnetcrunch.com 31 марта 2017 г.