Создание деревьев выражений из лямбды - PullRequest
2 голосов
/ 10 января 2012

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

(x) => x.Visits++

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

"set Visits = Visits + 1"

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

{$inc: {Visits : 1}}

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

Есть ли какой-нибудь способ сделать так, чтобы написать полную реализацию linq, поддерживающую обновление?

1 Ответ

4 голосов
/ 10 января 2012

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

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

Также имейте в виду - анализ дерева выражений для его возврата из снова далек от тривиальности. Выполнимо, конечно; просто: нет.

...