Подтвердить что ты не робот

Каков наилучший ресурс для углубленного изучения деревьев выражений С#?

Когда я впервые набрал этот вопрос, я сделал это, чтобы найти повторяющиеся вопросы, убедившись, что кто-то уже задал этот вопрос. Мой план состоял в том, чтобы следовать этим ссылкам, вместо того, чтобы публиковать этот вопрос. Но этот вопрос не задавался раньше, насколько я вижу... он не появился в списке "Вопросы, относящиеся".

Каковы некоторые из лучших ресурсов, которые вы нашли (статьи, книги, сообщения в блогах и т.д.), чтобы получить глубокое понимание деревьев выражений в С#? Я все время удивляюсь их возможности, и теперь я нахожусь в точке, где я говорю: "Хорошо, достаточно сюрприз. Я хочу остановиться прямо сейчас и получить докторскую степень в этих вопросах". Я ищу материал, который систематически, методично покрывает возможности, а затем просматривает подробные примеры того, что вы можете с ними сделать.

Примечание. Я не говорю о лямбда-выражениях. Я говорю об Expression <T> и все, что происходит с ним и вытекающее из него.

Спасибо.

4b9b3361

Ответ 1

Глава 11 (Внутренние деревья выражений) и глава 12 (Расширение Linq) программирования Microsoft Linq (ISBN 13: 978-0-7356-2400-9 или ISBN 10: 0-7356-2400-3) были неоценимы для меня. Я не читал книгу Джонса, но он качественный парень и хорошо объясняет, поэтому я предполагаю, что его охват также будет хорошим.

Еще один отличный ресурс - Блог Bart De Smet

Кроме того, следите за MSDN, пример кода для создания Simple Linq to Database (by Pedram Rezaei) вот-вот получит около 40 страниц Doco объясняют это.

На самом деле, действительно полезный ресурс для дерева выражений на самом деле я бы рассматривал его как обязательный инструмент визуализации визуализации выражений.

Вы также должны узнать как можно больше о посетителях дерева выражений, здесь есть довольно хороший базовый класс здесь.

Вот пример кода, полученный из этого класса Visitor, чтобы выполнить некоторую отладку (я основывал это на некотором примерном коде в упомянутой книге), вызов метода prependIndent - это просто метод расширения строки, чтобы поставить "-", на каждом уровне отступа.

  internal class DebugDisplayTree : ExpressionVisitor
  {
    private int indentLevel = 0;

    protected override System.Linq.Expressions.Expression Visit(Expression exp)
    {
      if (exp != null)
      {
        Trace.WriteLine(string.Format("{0} : {1} ", exp.NodeType, exp.GetType().ToString()).PrependIndent(indentLevel));
      }
      indentLevel++;
      Expression result = base.Visit(exp);
      indentLevel--;
      return result;
    }
    ...

Ответ 2

Я не утверждаю, что они были всеобъемлющими, но у меня есть несколько Expression сообщений в моем блоге. Если вы находитесь в Великобритании, я также буду проводить сеанс на Expression в DDD South West в мае (и прошлой ночью, но слишком поздно; -p). Я могу опубликовать слайд-колоду и некоторые ссылки из связанных статей, если вы хотите... К сожалению, pptx, предназначенный для разговоров, редко делает разумное отдельное чтение.

Некоторые другие чтения (не из блога):

(и вся загрузка сообщений здесь и на microsoft.public.dotnet.languages.csharp  - попробуйте выполнить поиск: + выражение -regex - "регулярное выражение"

Ответ 3

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

В качестве альтернативы вы можете посмотреть DLR, который похож, но гораздо менее изящный.