Создание деревьев выражений из лямбда

У меня есть лямбда-выражение:

(x) => x.Visits++

Во время выполнения я хочу перевести это в строку:

"set Visits = Visits + 1"

или, потенциально, если базовое хранилище данных отличается (например, MongoDB)

{$inc: {Visits : 1}}

Я думаю, что способ сделать это - использовать деревья выражений, но когда я назначаю лямбда-выражение в дерево выражений, я получаю: "Дерево выражений может не содержать оператор присваивания".

Есть ли способ сделать это, если не написать полную реализацию linq, которая поддерживает обновление?

Ответы

Ответ 1

Это просто не поддерживается текущим компилятором С#, и я не слышал о каких-либо изменениях в vNext. Конечно, строго говоря, для С# 3/4 это не определено - существует только "определено где-то еще" (на самом деле, AFAIK: спецификация для обработки дерева выражений еще формально не документирована, это может быть положительной вещью, так как трудно утверждать, что для этого потребуются изменения спецификации; p).

Самое смешное: начиная с .NET 4.0, дерево выражений API поддерживает мутировать (в этом случае см. Expression.Increment и Expression.PostIncrementAssign)), чтобы вы могли создать дерево выражений во время выполнения с помощью кода Expression.*, но, откровенно говоря, это боль и трудность в управлении. Таким образом, для этого можно использовать потенциал, но не слишком надейтесь.

Также имейте в виду - анализ дерева выражений, чтобы вытащить его обратно, далек от тривиального. Разумный; легко: нет.