动态LINQ和操作符重载

10

考虑以下代码:

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”不兼容 Source=DynamicLINQ Position=6

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

编辑:我还遇到了=运算符相同的问题。
通过查看源代码,我发现它会查找一个特殊接口来列出简单类型的许多方法,如果找不到,就会引发异常。问题是,我的类型(Vector2)不在那个列表中,所以它永远不会找到运算符方法。


1
George,我改变了我的立场,不再认为你应该创建“任何”接口或从给定的接口中扩展。我认为最好还是从其中一个接口进行扩展。未来可能会有其他类型检查(例如类型是否实际支持添加)之类的情况。 - Jeff Mercado
好的,谢谢;我已经相应地修改了我的代码。 - George Duckett
1个回答

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);
}

甚至可能包括 ISubtractSignatures 接口,因为在 Vector2 上减法是一种有效的操作。 - Jeff Mercado

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接