2009-09-15 25 views

Respuesta

7

Expression<T> se utiliza casi por completo para LINQ, pero no tiene para ser. Dentro de LINQ, generalmente se usa para "capturar" la lógica expresada en el código, pero mantenerlo en los datos. Luego, los datos pueden ser examinados por el proveedor de LINQ y manejados de manera apropiada, por ej. convirtiéndolo en SQL. Por lo general, los árboles de expresión en LINQ son creados por el compilador a partir de expresiones lambda o expresiones de consulta, pero en otros casos puede ser útil usar la API directamente usted mismo.

Algunos ejemplos de otros lugares lo he usado y visto que se usa:

  • En MiscUtil, Marc Gravell utilizó para poner en práctica "la aritmética genérico" - si un tipo tiene el operador en cuestión, que puede ser usado genéricamente
  • En UnconstrainedMelody que lo usaron de una manera similar a realizar operaciones en banderas enumeraciones, independientemente de su tipo subyacente (que es más complicado de lo que cabría esperar, debido a long y ulong tienen diferentes intervalos)
  • En Visual LINQ Solía ​​consulta expresiones para "animar" LINQ, para que pueda ver lo que está pasando. Si bien obviamente este es un uso de LINQ, no es la forma tradicional de traducir la lógica a otra forma.
+0

¿dónde puedo ver 'VisualLINQ'? – flesh

+0

Vaya, se supone que debe incluir un enlace a la publicación del blog. Espera ... –

0

Eche un vistazo a mi antes de & después del código en my answer to another SO question.

Resumen: Expression<> simplificó enormemente el código, lo hizo más fácil de entender, e incluso solucionó un error fantasma.

4

En términos de LINQ, hay cosas que puede hacer para crear consultas LINQ más versátiles en tiempo de ejecución de lo que puede hacer simplemente en lambdas.

He utilizado Expression muchas veces como microcompilador, como alternativa a DynamicMethod y IL. Este enfoque se hace más fuerte en .NET 4.0 (as discussed on InfoQ), pero incluso en 3.5 hay un montón de cosas que puede hacer (por lo general basado en datos de tiempo de ejecución; configuración, etc):

también utilicé como parte de un motor de matemáticas para algunos wo Lo hice con Microsoft, es decir, analizar una expresión matemática ("(x + 12) * y = z", etc.) en un árbol Expression, compilarlo y ejecutarlo.

Otro uso intersting (ilustrado por Jason Bock, here) se encuentra en la programación genética; construye tus candidatos como árboles Expression, y tienes el código necesario para ejecutarlos rápidamente (después de Compile()), pero lo más importante (para la programación genética), también para intercambiar fragmentos.

+0

¿Hay algún lugar donde podamos ver el código que hiciste para Microsoft? Realmente me gustaría ver algunos ejemplos de este tipo de cosas ... – flesh

+0

Tengo una copia, pero no creo que sea sensato publicarla "tal cual" (es propiedad conjunta de mi empleador y Microsoft) Trataré de encontrar tiempo para volver a hacer desde el principio: no es mucho, escribí el original en el tren camino al Reading HQ de Microsoft; –

Cuestiones relacionadas