重写的表达式调用运算符方法...但原始节点没有运算符方法

时间:2016-04-05 12:23:26

标签: c# expression-trees linq-expressions

我试图更改表达式树的一部分,其中MyEnum类型的属性X与某个值x进行比较:

$model.X == .Constant<MyEnum>(x)

我想修改树以替换比较,以将类型Guid的属性Y与值y(将从x派生)进行比较。

$model.Y == .Constant<Guid>(y)

所以我从ExpressionVisitor继承并且我已经覆盖了VisitMember来代替Y代替X,而我已经覆盖VisitConstant来代替y代替X

运行此命令会产生以下InvalidOperationException

  

System.InvalidOperationException:重写的表达式调用operator方法&#39;布尔op_Equality(System.Guid,System.Guid)&#39;,但原始节点没有运算符方法。如果这是故意的,请覆盖&#39; VisitBinary&#39;并将其更改为允许重写。

我的主要问题是:VisitBinary我该怎么办?我的问题是:为什么异常消息告诉原始节点没有操作符方法。我认为这不是真的。它确实没有op_Equality(System.Guid, System.Guid),但我认为它有MyEnum类型的相等运算符。

1 个答案:

答案 0 :(得分:3)

我猜测MyEnum是某种Enum类型的名称。

Enum类型不需要运算符方法,因为CIL直接处理它们的相等比较(内置的整数,浮点和布尔类型也是如此)。

无法通过BinaryExression.Update()更改方法(将在您的访问者中明确调用或隐式调用,因为您的访问者已更改左右两个表达式中的一个或两个,并且&# 39; s在这种情况下的默认行为)您必须VisitBinary()通过对BinaryExpression的适当调用创建并返回新的Expression.Equal()