4

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

有任何想法吗?

4

4 回答 4

2

对于 .net 3.5,您不能这样做,因为 Expression 构造函数接受 ExpressionType 枚举值,并且您不能向枚举添加新节点类型。

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

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

于 2009-07-01T01:16:22.550 回答
1

这正是 codeplex 上的 DLR 代码必须做的事情;最后,他们在不同的命名空间(IIRC) 中重新创建了整个代码库,直到 4.0 发布。

这不一定能很好地与 C# 编译器配合使用。老实说我没试过。

于 2009-06-11T14:43:46.407 回答
0

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

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

于 2009-06-11T14:40:44.120 回答
0

我自己也没有尝试过,但我同意 Scott 的说法,即这应该在 4.0 中工作。

具体来说,CodePlex 上的表达式树规范说明了 NodeType 属性:

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

于 2010-06-03T16:32:53.580 回答