动态linq和运算符重载

Geo*_*ett 10 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");
Run Code Online (Sandbox Code Playgroud)

运行它,我得到以下例外:

System.Linq.Dynamic.ParseException未由用户代码处理Message = Operator'+'与操作数类型'Vector2'和'Vector2'不兼容Source = DynamicLINQ Position = 6

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

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

Jef*_*ado 2

使用 DynamicLinq 库时,您需要将签名添加到System.Linq.Dynamic.ExpressionParser. 它只会解析它识别的操作。

看起来它会查看 中找到的所有私有接口ExpressionParser。只需在其中添加一个接口ExpressionParser,它似乎就可以抑制错误。

interface ICustomSignatures
{
    void F(Microsoft.Xna.Framework.Vector2 x, Microsoft.Xna.Framework.Vector2 y);
}
Run Code Online (Sandbox Code Playgroud)

为了安全起见(并且可能符合预期模式),添加到接口/从IAddSignatures接口扩展可能会更安全。

interface ICustomSignatures : IAddSignatures
{
    void F(Microsoft.Xna.Framework.Vector2 x, Microsoft.Xna.Framework.Vector2 y);
}
Run Code Online (Sandbox Code Playgroud)