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

4

是否可以创建自定义表达式类?如果可以,有没有任何示例?继承框架抽象Expression类存在问题,因为它的构造函数需要一个ExpressionType参数,这是一个框架枚举类型 - 我显然无法自定义!

有什么想法吗?

4个回答

2

使用 .net 3.5 不可以这样做,因为 Expression 构造函数需要一个 ExpressionType 枚举值,而你不能向枚举中添加新的节点类型。

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

根据 MSDN 文档,在 CLR v4 中看起来可以做到这一点,只要你覆盖 “Reduce” 方法并使用节点类型 ExpressionType.Extension。


1

这正是 codeplex 上的 DLR 代码所必须做的事情;最终,他们重新创建了整个代码库 (在我记得的情况下)但使用了不同的命名空间, 直到 4.0 版本发布.

这不一定与 C# 编译器兼容; 我老实说没有尝试过.


谢谢Marc。我想知道,当C#4.0发布时,DLR代码是否会取代Linq表达式成为首选的表达式库? - MalcomTucker

0
我自己也没有尝试过,但我同意Scott的说法,这应该在4.0中有效。
具体来说,CodePlex上的Expression Tree Spec关于NodeType属性有以下说明:

不属于.NET公共节点集合的Expression派生类应返回节点类型Extension


0

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

例如,也许你总是喜欢比较两个字符串,所以你可以添加一个扩展方法来返回执行比较的树。你还可以添加一个调用代码中其他地方函数的表达式,这样你只需要为必须以这种方式开发的内容编写表达式树。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接