【问题标题】:Dynamic linq and operator overloads动态 linq 和运算符重载
【发布时间】:2012-01-12 15:34:48
【问题描述】:

考虑下面的代码:

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=Operator '+' 与操作数类型 'Vector2' 和 'Vector2' 不兼容 源=动态LINQ 位置=6

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

编辑:= 运算符也有同样的问题。
查看源代码,我可以明白为什么,它查看了一个特殊的接口,该接口列出了简单类型的方法负载,如果找不到,则会引发异常。麻烦的是,我的类型 (Vector2) 不在那个列表中,所以它永远找不到操作符方法。

【问题讨论】:

  • George,我已经恢复了我的立场,即您是否应该只创建 any 接口或从给定接口之一扩展。我认为从其中一个接口扩展会更安全。将来可能会或可能不会进行额外的类型检查(例如类型实际上是否支持添加)或诸如此类。
  • 好点,谢谢;我已经相应地更改了我的代码。

标签: c# linq expression-trees dynamic-linq


【解决方案1】:

使用 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 上的有效操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-30
  • 1970-01-01
  • 1970-01-01
  • 2016-02-19
  • 2012-11-26
相关资源
最近更新 更多