【发布时间】:2017-05-16 21:59:13
【问题描述】:
我从 MSDN 关于How to: Modify Expression Trees 的文章中知道ExpressionVisitor 应该做什么。它应该修改表达式。
然而,他们的例子非常不切实际,所以我想知道为什么我需要它?您能否列举一些修改表达式树有意义的真实案例?或者,为什么必须对其进行修改?从什么到什么?
它也有许多访问各种表达式的重载。我怎么知道什么时候应该使用它们以及它们应该返回什么?我看到人们使用VisitParameter 并返回base.VisitParameter(node),而另一方面又返回Expression.Parameter(..)。
【问题讨论】:
-
如果你想修改一个树结构,访问者是一种非常标准的技术来实现这一点,尤其是对于不可变的树。这为此类访问者提供了一个基类。您只需覆盖需要更改的节点类型的方法并返回新节点。访问者作为一个整体逐步构建一棵新树。
-
@LucasTrzesniewski 这是我已经发现的(好吧,没有节点类型,这是我不知道的)我对我以前可以拥有什么以及会出现什么很感兴趣。什么样的表达式树需要从什么修改到什么?这是缺少的链接。
-
嘿,答案是无论你需要做什么。表达式树不需要 修改,您 可能出于某种原因需要修改它们。一个真实的例子见LINQKit(AsExpandable 重写表达式)。
-
真正的那个是
internal,当时我记得复制/粘贴了一个反编译的版本,所以我可以使用它。 MS最终决定将其公开。出于同样的原因,我想 LINQKit 有一个自定义版本,这让它们可以支持旧的框架版本。 -
@t3chb0t MSDN 文档?除此之外,还有信息量很大的codeplex.com/Download?ProjectName=dlr&DownloadId=246540,它既有一些高级细节,也有一些低级细节,虽然它描述的一些事情从未实现过,但它提供了不同的视角。
标签: c# expression-trees expressionvisitor