2012-01-12 13 views
10

consideri il codice qui sotto:dinamici LINQ e operatore sovraccarichi

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"); 

corsa, ottengo l'eccezione di seguito:

System.Linq.Dynamic.ParseException è stata gestita dal codice utente Messaggio = operatore '+' incompatibile con i tipi di operando 'Vector2' e 'Vettore2' Source = DynamicLINQ Posizione = 6

Come si ottiene il parser per "vedere" il sovraccarico dell'operatore + sul tipo Vector2?

MODIFICA: Ho anche lo stesso problema con l'operatore =.
Guardando al codice sorgente posso capire perché, guarda un'interfaccia speciale che elenca un sacco di metodi, per tipi semplici e se non riesce a trovarlo, solleva l'eccezione. Il problema è che il mio tipo (Vector2) non è presente nell'elenco, quindi non troverà mai i metodi dell'operatore.

+1

George, ho ripristinato la mia posizione sull'opportunità o meno di creare un'interfaccia _any_ o estendere da una delle interfacce specificate. Penso che sarebbe più sicuro estendere da una delle interfacce. Potrebbero esserci o meno verifiche di tipo aggiuntive (come il tipo che in realtà supporterà l'aggiunta) in futuro o quant'altro. –

+0

Buon punto, grazie; Ho modificato il mio codice di conseguenza. –

risposta

2

Lavorando con la libreria DynamicLinq, è necessario aggiungere la firma a una delle interfacce di firma disponibili nello System.Linq.Dynamic.ExpressionParser. Analizzerà solo le operazioni che riconosce.

Sembra che esaminerà tutte le interfacce private trovate in ExpressionParser. Basta aggiungere un'interfaccia all'interno dello ExpressionParser e sembra sopprimere l'errore.

interface ICustomSignatures 
{ 
    void F(Microsoft.Xna.Framework.Vector2 x, Microsoft.Xna.Framework.Vector2 y); 
} 

giusto per essere sicuri (e possibilmente montare il modello previsto), potrebbe essere più sicuro di aggiungere/estendersi dall'interfaccia IAddSignatures.

interface ICustomSignatures : IAddSignatures 
{ 
    void F(Microsoft.Xna.Framework.Vector2 x, Microsoft.Xna.Framework.Vector2 y); 
} 
+0

Probabilmente anche l'interfaccia 'ISubtractSignatures' dato che la sottrazione è un'operazione valida su' Vector2'. –

Problemi correlati