2012-01-12 17 views
10

considerar el código de abajo:LINQ y del operador sobrecargas dinámicas

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

Correr, consigo la excepción a continuación:

System.Linq.Dynamic.ParseException era controlada por el código de usuario Mensaje = operador '+' incompatible con los tipos de operando 'Vector2' y 'Vector2' Fuente = DynamicLINQ Posición = 6

¿Cómo obtengo el analizador para 'ver' la sobrecarga del operador + en el tipo Vector2?

EDITAR: También tengo el mismo problema con el operador =.
Al mirar la fuente puedo ver por qué, se ve una interfaz especial que enumera una gran cantidad de métodos, para tipos simples y si no puede encontrarla, entonces se genera la excepción. El problema es que mi tipo (Vector2) no está en esa lista, por lo que nunca encontrará los métodos del operador.

+1

George, he revertido mi posición sobre si deberías simplemente crear _any_ interface o extender desde una de las interfaces dadas. Creo que sería más seguro extender desde una de las interfaces en su lugar. Puede haber o no verificación adicional de tipo (tal como el tipo en realidad admite la adición) en el futuro o lo que sea. –

+0

Buen punto, gracias; He alterado mi código en consecuencia. –

Respuesta

2

Al trabajar con la biblioteca DynamicLinq, deberá agregar la firma a una de las interfaces de firma que se encuentran en el System.Linq.Dynamic.ExpressionParser. Solo analizará las operaciones que reconoce.

Parece que verá todas las interfaces privadas encontradas en ExpressionParser. Simplemente agregue una interfaz dentro del ExpressionParser y parece suprimir el error.

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

sólo para estar seguro (y posiblemente se ajustan al patrón previsto), que podría ser más seguro para añadir a/extenderse desde la interfaz IAddSignatures.

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

Posiblemente incluso la interfaz 'ISubtractSignatures' ya que la resta es una operación válida en' Vector2'. –

Cuestiones relacionadas