我试图更改表达式树的一部分,其中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类型的相等运算符。
答案 0 :(得分:3)
我猜测MyEnum
是某种Enum
类型的名称。
Enum
类型不需要运算符方法,因为CIL直接处理它们的相等比较(内置的整数,浮点和布尔类型也是如此)。
无法通过BinaryExression.Update()
更改方法(将在您的访问者中明确调用或隐式调用,因为您的访问者已更改左右两个表达式中的一个或两个,并且&# 39; s在这种情况下的默认行为)您必须VisitBinary()
通过对BinaryExpression
的适当调用创建并返回新的Expression.Equal()
。