2012-01-12 80 views
10

考虑下面的代码:动态LINQ和运算符重载

var vectorTest = new Vector2(1, 2) + new Vector2(3, 4); // Works 

var x = Expression.Parameter(typeof(Vector2), "x"); 
var test = System.Linq.Dynamic 
       .DynamicExpression.ParseLambda(new[] { x }, null, "x = x + x"); 

运行它,我得到下面的异常:

System.Linq.Dynamic.ParseException是由用户代码 消息未处理=运算符 '+' 与操作数类型的 'Vector2' 和 'Vector2' 源= DynamicLINQ 位置不相容= 6

如何让解析器在Vector2类型上“看到”+运算符超载?

编辑:我也遇到了与=运营商相同的问题。
查看源代码,我可以看到为什么,它查看列出大量方法的特殊界面,对于简单类型,如果找不到它,则会引发异常。麻烦的是,我的类型(Vector2)不在该列表中,所以它不会找到运算符方法。

+1

George,对于是否应该创建_any_接口或从其中一个给定接口进行扩展,我已经回复了我的观点。我认为从其中一个接口扩展会更安全。未来可能会或可能不会进行额外的类型检查(例如类型实际上是否支持添加)。 – 2012-01-12 21:23:18

+0

好点,谢谢;我已经相应地更改了我的代码。 – 2012-01-12 21:30:46

回答

2

使用DynamicLinq库时,您需要将签名添加到System.Linq.Dynamic.ExpressionParser中的某个签名界面。它只会解析它承认的操作。

看来它会查看ExpressionParser中的所有私人界面。只需在ExpressionParser内添加一个接口,它似乎可以抑制错误。

interface ICustomSignatures 
{ 
    void F(Microsoft.Xna.Framework.Vector2 x, Microsoft.Xna.Framework.Vector2 y); 
} 

为了安全起见(也可能是符合预期的图案),它可能是更安全的添加/从IAddSignatures接口扩展。

interface ICustomSignatures : IAddSignatures 
{ 
    void F(Microsoft.Xna.Framework.Vector2 x, Microsoft.Xna.Framework.Vector2 y); 
} 
+0

自减法以来,可能甚至是'ISubtractSignatures'接口都是对'Vector2'的有效操作。 – 2012-01-12 21:26:58