Да, это должно быть возможно. Однако это немного сложнее, чем кажется на первый взгляд, для правильной реализации переписывающего устройства дерева выражений. Особенно, если вы хотите иметь возможность правильно обрабатывать поля, свойства, индексированные свойства, вызовы методов и другие конструкции, допустимые в произвольных выражениях.
Это также может быть не самая эффективная операция, поскольку для оценки выражения необходимо динамически компилировать дерево выражений в лямбда-функцию каждый раз.
Существует реализация для этого шаблона в CodePlex . Я никогда не использовал его лично, поэтому я не могу сказать, насколько хорошо он реализован или обрабатывает ли он все описанные мной случаи.
Альтернативой созданию средства переписывания дерева выражений является запись Maybe()
для принятия лямбда-функции (а не дерева выражений) и перехвата любого ArgumentNullException
сгенерированного значения, возвращающего default(T)
в этих случаях. Это приводит к тому, что многие люди неправильно используют исключения для управления потоком таким образом ... но это, безусловно, более простая реализация. Я лично избегаю этого, поскольку он может маскировать ошибки нулевых ссылок в методах, вызываемых как часть выражения, что нежелательно.