请考虑以下代码:
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
)不在该列表中,所以它永远不会找到运算符方法。
答案 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);
}