c# - 从 lambda 创建表达式树

标签 c# expression-trees

我有一个 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.IncrementExpression. PostIncrementAssign) - 因此您可以通过Expression.* 代码在运行时创建表达式树,但坦率地说,这很痛苦且难以管理。因此,这种情况有可能发生改变,但不要抱太大希望。

另请记住 - 将其拉回 的表达式树分析远非微不足道。可行,当然;简单:没有。

关于c# - 从 lambda 创建表达式树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8796056/

相关文章:

c# - 正则表达式不匹配所有外来字符

c# - Expression.Coalesce 的转换参数是做什么用的?

c# - 使用 ExpressionTree 生成动态查询时出错

c# - 方便还是 "lazy programming"IList管理-保护IList.Add方法

c# - 将服务安装为 x64

c# - 表达式树深度限制

c# - 动态构建表达式树

c# - 将返回表达式的方法引用到另一个方法的语法?

c# - .xps 文件的正确内容类型是什么

c# - 方法中的可选参数不是矩形的编译时常量错误