Я в значительной степени полагаюсь на деревья выражений, чтобы подтолкнуть большую часть того, что я хочу сделать с моим текущим приложением, во время компиляции, то есть статическую проверку типов.
Я пересекаю деревья выражений, чтобы перевести их во что-то еще, что «имеет смысл».
Одна вещь, которую я часто делал, заключается в том, что вместо URL я полагаюсь на MVC-подобный подход, где я объявляю лямбда-функции и транслирую это ... интерпретировать, сгенерированное компилятором дерево выражений в URL. Когда этот URL вызывается, я делаю наоборот. Таким образом, у меня есть то, что я называю проверками во время компиляции для битых ссылок, и это прекрасно работает с рефакторингом и перегрузками. Я думаю, это здорово думать об использовании деревьев выражений таким образом.
Возможно, вы захотите проверить шаблон посетителя, с чего начинать очень трудно, потому что вначале он не имеет особого смысла, но он связывает все воедино и это очень формальный способ решения проверки типов в конструкции компилятора. Вы можете сделать то же самое, но вместо проверки типов выведите все, что вам нужно.
Что-то, против чего я сейчас вхожу, - это возможность создать простую структуру для перевода (или, на самом деле, я должен сказать, интерпретировать) выражений Tress и испускания JavaScript. Идея состоит в том, что сгенерированные компилятором деревья выражений преобразуются в действительный JavaScript, который взаимодействует с некоторой объектной моделью.
Что удивительно в этом, так это то, что компилятор всегда может сообщить мне, когда я ошибаюсь, и уверен, что конечный результат - это просто набор строк, но важная часть заключается в том, как эти строки были созданы. Они прошли некоторую проверку, и это что-то значит.
Как только вы начнете это делать, вы мало что сможете сделать с деревьями выражений.
Работая с материалом System.Reflection.Emit, я обнаружил, что использую деревья выражений для создания облегченного фреймворка для динамической компиляции, который во время компиляции может в основном сказать, будут ли компилироваться мои динамически созданные сборки, и это сработало легко с отражением и статической проверкой типа. Это пошло дальше и дальше, и в итоге получилось нечто, что в итоге сэкономило много времени и оказалось очень проворным и надежным.
Так что мне нравятся такие вещи, и это то, чем занимается метапрограммирование, написание программ в ваших программах, которые делают программы. Я говорю, продолжай!