Pregunta

¿Qué es exactamente Expression < > utilizado en C #? ¿Hay escenarios en los que instanciarías a Expression < > como un objeto? Si es así, ¡da un ejemplo!

¡Gracias!

¿Fue útil?

Solución

Expression < T > se usa casi por completo para LINQ, pero no tiene que ser . Dentro de LINQ, generalmente se usa para "capturar" La lógica expresada en código, pero mantenerla en los datos. Esos datos pueden ser examinados por el proveedor de LINQ y manejados adecuadamente, por ejemplo convirtiéndolo en SQL. Por lo general, el compilador crea los árboles de expresión en LINQ 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 en los que lo he usado y visto:

  • En MiscUtil , Marc Gravell lo usó para implementar " aritmética genérica " - si un tipo tiene el operador relevante, se puede usar genéricamente.
  • En UnconstrainedMelody lo utilicé de manera similar para realizar operaciones en enumeraciones de banderas, independientemente de su tipo subyacente (que es más complicado de lo que cabría esperar, debido a que long y ulong tienen diferentes rangos)
  • En Visual LINQ Utilicé expresiones de consulta para "animar" LINQ, para que puedas ver lo que está pasando. Aunque obviamente este es un uso de LINQ, no es la forma tradicional de traducir la lógica a otra forma.

Otros consejos

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 puramente en lambdas.

He usado Expression muchas veces como microcompilador, como alternativa a DynamicMethod e IL. Este enfoque se fortalece en .NET 4.0 ( como se describe en InfoQ ), pero incluso en 3.5 hay lotes de cosas que puede hacer (generalmente basadas en datos de tiempo de ejecución; configuración, etc.):

También lo usé como parte de un motor matemático para algunos trabajos que hice con Microsoft, es decir, analizar una expresión matemática (" (x + 12) * y = z " etc) en una expresión árbol, compílelo y ejecútelo.

Otro uso interesante (ilustrado por Jason Bock, aquí ) está en programación genética; construya sus candidatos como árboles Expression , y tiene 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 alrededor.

Echa un vistazo a mi antes & amp; después del código en mi respuesta a otra pregunta SO .

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top