如何在C#中创建自定义System.Linq.Expression类?

时间:2009-06-11 14:37:06

标签: c# expression-trees

是否可以创建自定义Expression类?如果是这样,有没有人有任何例子?继承自框架抽象Expression类带来了一个问题,因为它的构造函数采用ExpressionType参数,这是一个框架枚举类型 - 我显然无法自定义它!

有什么想法吗?

4 个答案:

答案 0 :(得分:2)

使用.net 3.5,您无法执行此操作,因为Expression构造函数接受ExpressionType枚举值,并且您无法将新节点类型添加到枚举中。

您也不能重载现有节点类型,因为您无法从任何“叶类”(如BinaryExpression)继承,因为它们都是密封的。

根据MSDN文档,您可以在CLR v4中执行此操作,只要您覆盖“Reduce”方法并使用节点类型ExpressionType.Extension。

答案 1 :(得分:1)

这正是codeplex上的DLR代码所必须做的;最后,他们重新创建了整个代码库in a different namespace(IIRC),直到4.0发布。

这不一定适合C#编译器;老实说,我没有尝试过。

答案 2 :(得分:0)

我不相信你可以扩展Expression,但我认为你可以添加几个扩展方法来创建表达式树来简化生成。

例如,您可能总是喜欢比较2个字符串,因此您可以添加一个扩展方法,该方法将返回树进行比较。您还可以添加一个在代码中的其他位置调用函数的表达式,这样您就只能为绝对必须以这种方式开发的东西编写表达式树。

答案 3 :(得分:0)

我自己也没有尝试过,但我同意Scott的说法,即这应该适用于4.0。

具体来说,Expression Tree Spec on CodePlex说明了NodeType属性:

  

表达式的派生不是   在.NET中的公共节点集中   应返回节点类型扩展