¿Cuáles son algunos casos en los que los árboles de expresión son útiles?

StackOverflow https://stackoverflow.com/questions/27726

  •  09-06-2019
  •  | 
  •  

Pregunta

Entiendo completamente el concepto de árboles de expresión, pero me cuesta encontrar situaciones en las que sean útiles.¿Existe algún caso específico en el que se puedan aplicar árboles de expresión?¿O sólo es útil como mecanismo de transporte de código?Siento que me falta algo aquí.¡Gracias!

¿Fue útil?

Solución

¿O sólo es útil como mecanismo de transporte de código?

Es útil como mecanismo de ejecución para el código.Utilizando el patrón de intérprete, los árboles de expresión se pueden interpretar directamente.Esto es útil porque es muy fácil y rápido de implementar.Estos intérpretes son omnipresentes y se utilizan incluso en casos que no parecen "interpretar" nada, p.para imprimir estructuras anidadas.

Otros consejos

Algunos marcos simulados de pruebas unitarias utilizan árboles de expresión para establecer expectativas/verificaciones fuertemente tipadas.Es decir:

myMock.Verify(m => m.SomeMethod(someObject)); // tells moq to verify that the method
                                              // SomeMethod was called with 
                                              // someObject as the argument

Aquí, la expresión nunca se ejecuta realmente, pero la expresión en sí contiene información interesante.La alternativa sin árboles de expresión sería

myMock.Verify("SomeMethod", someObject) // we've lost the strong typing

Los árboles de expresión son útiles cuando necesita acceder a la lógica de funciones para modificarla o volver a aplicarla de alguna manera.

Linq a SQL es un buen ejemplo:

//a linq to sql statement
var recs (
    from rec in LinqDataContext.Table
    where rec.IntField > 5
    select rec );

Si no tuviéramos árboles de expresión, esta declaración tendría que devolver todos los registros y luego aplicar la lógica de C# donde a cada uno.

Con árboles de expresión que where rec.IntField > 5 se puede analizar en SQL:

--SQL statment executed
select *
from [table]
where [table].[IntField] > 5
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top