Укусил Любопытный понять Дерево выражений в.NET

Обновленная ссылка для Ganymede (Eclipse 3.4):

http://help.eclipse.org/ganymede/topic/org.eclipse.platform.doc.user/concepts/cprbview.htm

, Но я соглашаюсь с фундаментальной проблемой: проблемы просматривают фильтрацию потребностей по Ресурсу, не просто Описание.

В моем случае, я включаю сгенерированный код jsp в свой исходный путь, и существуют все виды предупреждения, которые происходят в * _jsp.java файлы (как неиспользованное приложение, страница, конфигурация, page_context переменные). Таким образом, было бы хорошо исключить их шаблоном Ресурса. (Или для jspc для не записи неиспользованного кода..., но это - другой вопрос в целом).

6
задан ulrichb 27 February 2010 в 16:42
поделиться

5 ответов

Дерево выражений представляет собой дерево синтаксиса одного выражения.

Каждый узел дерева представляет некоторую константу, ссылку на член объекта или операцию.

Например, для выражения 2 + 3 мы можем построить и дерево выражений:

Expression.MakeBinary(
    ExpressionType.Add,
    Expression.Constant(2),
    Expression.Constant(3));

Наиболее важным из таких деревьев является Выражение что позволяет записывать выражения в удобочитаемой форме, напоминающей лямбда-функции сопоставления подписи TDelegate. Вот пример ex

Expression<Func<int>> sum = () => 2 + 3; // much nicer, eh?

, но Expression не является делегатом, так как он не может быть выполнен напрямую.

Вместо этого по нему можно пройти, например, с помощью объекта посетителя для построения некоторого исполняемого представления. Примерами могут быть сборка делегата с помощью Expression.Compile () или запрос SQL, построенный из запроса LINQ с использованием CompiledQuery.Compile () и т. Д.

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

PropertyInfo prop1 = typeof(MyClass).GetProperty("Value");

Expression<Func<MyClass, int>> expr = mc => mc.Value;
PropertyInfo prop2 = (mc.Body as MemberExpression).Member as PropertyInfo;
16
ответ дан 8 December 2019 в 02:52
поделиться

Выражение - это универсальный способ выражения операций кода в виде объектной модели. Это намного больше расширено в 4.0, но в этой области я использую лот ; У меня есть несколько статей здесь , или еще одна попытка объяснить все это в InfoQ . Я также представлял эту тему несколько раз - возможно, попробуйте загрузить здесь (но без слов это не будет иметь такого большого смысла; извините).

Буду честен; это не простой предмет - но он чрезвычайно , когда вы его ощупываете. Исходя из вышесказанного, я бы, наверное, начал с InfoQ.

Это намного больше расширено в 4.0, но в этой области я использую лот ; У меня есть несколько статей здесь , или еще одна попытка объяснить все это в InfoQ . Я также представлял эту тему несколько раз - возможно, попробуйте загрузить здесь (но без слов это не будет иметь такого большого смысла; извините).

Буду честен; это не простой предмет - но он чрезвычайно , когда вы его ощупываете. Исходя из вышесказанного, я бы, наверное, начал с InfoQ.

Это намного больше расширено в 4.0, но в этой области я использую лот ; У меня есть несколько статей здесь , или еще одна попытка объяснить все это в InfoQ . Я также представлял эту тему несколько раз - возможно, попробуйте загрузить здесь (но без слов это не будет иметь такого большого смысла; извините).

Буду честен; это не простой предмет - но он чрезвычайно , когда вы его ощупываете. Исходя из вышесказанного, я бы, наверное, начал с InfoQ.

не имеет такого же смысла без слов; извините).

Буду честен; это не простой предмет - но он чрезвычайно , когда вы его ощупываете. Исходя из вышесказанного, я бы, наверное, начал с InfoQ.

не имеет такого же смысла без слов; извините).

Буду честен; это не простой предмет - но он чрезвычайно , когда вы его ощупываете. Исходя из вышесказанного, я бы, наверное, начал с InfoQ.

10
ответ дан 8 December 2019 в 02:52
поделиться

Вот статья , которая объясняет основы ...

Вкратце:

1) В принципе, да, это представление логики в памяти.

2) Его можно скомпилировать в MSIL (или, как в случае LINQ-to-SQL, также и в другие языки).

3) Делегаты Func <> используются, потому что они используются для представления выражения как вызываемой функции (которая внутренне компилируется как MSIL).

3
ответ дан 8 December 2019 в 02:52
поделиться

Я не эксперт в этом вопросе, но постараюсь расчистить путь.

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

Итак,
1) Я бы сказал, да.
2) Не совсем ... вы должны сначала изучить эту функцию (я тоже), а затем найти, для чего она нужна. Вы генерируете код? что для меня может быть очень полезной функцией деревьев выражений
3) Дерево выражений - это новая функция, но вы ничего не могли сделать раньше. Теперь это просто.

Здесь есть хорошая статья , которая объясняет основы.

1
ответ дан 8 December 2019 в 02:52
поделиться

Я попытался ответить на такие же вопросы, как ваш, в блоге C # FAQ в следующем сообщении блога: Создание динамических методов с помощью деревьев выражений в Visual Studio 2010 . Так что да, это в памяти. Я не понимаю, что вы имеете в виду под «определяемыми пользователем шаблонами», но вы можете использовать его для написания динамического кода. И нет, вы не можете заменить ET делегатами, потому что вы не можете изменять делегатов во время выполнения. Единственной заменой может быть MSIL, который гораздо труднее читать и писать.

2
ответ дан 8 December 2019 в 02:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: