我有一个 lambda 表达式:
(x) => x.Visits++
在运行时,我想把它翻译成字符串:
"set Visits = Visits + 1"
或者,如果底层数据存储不同(比如 MongoDB)
{$inc: {Visits : 1}}
我认为这样做的方法是使用表达式树,但是当我将 lambda 表达式分配给表达式树时,我得到“表达式树可能不包含赋值运算符”。
除了编写支持更新的完整 linq 实现之外,还有什么方法可以完成这个任务吗?
最佳答案
当前的 C# 编译器根本不支持它,而且我还没有听说 vNext 有任何变化。当然,严格来说它不是为 C# 3/4 定义的——只有一个“在别处定义”(实际上,AFAIK:处理表达式树构造的规范仍然没有正式记录; 这可能是一件积极的事情,因为很难说它需要规范更改;p)。
有趣的是:从 .NET 4.0 开始,表达式树 API 确实 支持 mutate(在这种情况下,请参阅 Expression.Increment
和 Expression. PostIncrementAssign
) - 因此您可以通过Expression.*
代码在运行时创建表达式树,但坦率地说,这很痛苦且难以管理。因此,这种情况有可能发生改变,但不要抱太大希望。
另请记住 - 将其拉回 的表达式树分析远非微不足道。可行,当然;简单:没有。
关于c# - 从 lambda 创建表达式树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8796056/