C # .NET 3.5: ¿Qué es la expresión < > ¿usado para?
-
07-07-2019 - |
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!
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
yulong
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.):
- operadores genéricos
- clonación de objetos
- inicialización compleja
- comparación de objetos
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.