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
)不在该列表中,所以它永远不会找到运算符方法.
使用 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)