2012-01-12 36 views
10

考慮下面的代碼:動態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"); 

運行它,我得到下面的異常:

System.Linq.Dynamic.ParseException是由用戶代碼 消息未處理=運算符 '+' 與操作數類型的 'Vector2' 和 'Vector2' 源= DynamicLINQ 位置不相容= 6

如何讓解析器在Vector2類型上「看到」+運算符超載?

編輯:我也遇到了與=運營商相同的問題。
查看源代碼,我可以看到爲什麼,它查看列出大量方法的特殊界面,對於簡單類型,如果找不到它,則會引發異常。麻煩的是,我的類型(Vector2)不在該列表中,所以它不會找到運算符方法。

+1

George,對於是否應該創建_any_接口或從其中一個給定接口進行擴展,我已經回覆了我的觀點。我認爲從其中一個接口擴展會更安全。未來可能會或可能不會進行額外的類型檢查(例如類型實際上是否支持添加)。 – 2012-01-12 21:23:18

+0

好點,謝謝;我已經相應地更改了我的代碼。 – 2012-01-12 21:30:46

回答

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

自減法以來,可能甚至是'ISubtractSignatures'接口都是對'Vector2'的有效操作。 – 2012-01-12 21:26:58