Прежде чем начать с Expression Trees
, давайте сначала разберемся с Expression
в .NET.
В .NET Expression
— это абстрактный класс, который содержит статические методы и наследуется различными типами (такими как ParameterExpression
, MethodCallExpression
, BinaryExpression
и т. д.) для создания узлов дерева выражений определенных типов. Кроме того, все эти типы дерева выражений, специфичные для выражений, определены в пространстве имен System.Linq.Expressions
.
Деревья выражений были впервые представлены в C# 3.0 (Visual Studio 2008), где они в основном использовались поставщиками LINQ. Чтобы узнать больше о функциях 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>
имеет четыре свойства, как указано ниже:
- Тело: Тело выражения.
- Параметры: параметры лямбда-выражения.
- NodeType: тип узла в дереве.
- Тип: Тип выражения
Спасибо за чтение и дайте мне знать ваши ценные комментарии, если таковые имеются.
Нравится этот пост? Не забудьте поделиться!
Это гостевой пост пользователя Sanskriti. Если вы хотите написать для DotnetCrunch, ознакомьтесь с нашими правилами гостевых публикаций.
Что вы думаете?
Уважаемые читатели,
Если у вас есть какие-либо вопросы или предложения, пожалуйста, напишите нам по электронной почте или поделитесь своими мыслями в комментариях ниже. Мы были бы рады получить известия от вас. Если вы нашли этот пост или статью полезной, поделитесь ею с друзьями и помогите им научиться.
Удачного программирования!
Первоначально опубликовано на сайте dotnetcrunch.com 31 марта 2017 г.