动态linq和运算符重载

时间:2012-01-12 15:34:49

标签: c# linq expression-trees dynamic-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未被用户代码处理     Message =运算符'+'与操作数类型'Vector2'和'Vector2'不兼容     来源= DynamicLINQ     位置= 6

如何让解析器“看到”+类型的Vector2运算符重载?

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

1 个答案:

答案 0 :(得分: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);
}