Los Arboles de expresiones son una de las facetas diferentes de representación y utilización de las funciones lambda, y en específico en forma de datos. Las expresiones lambda se compilan como código o como datos en dependencia del contexto en que se utilizan. Es importante destacar que para la utilización de las funciones lambda podemos utilizar variables de tipo delegado (Variables que representan a una función) o variables genéricas.
Es importante aclarar que en algunos lenguajes se permite manejar código como si fueran datos y los datos como si fueran código. A esta característica se le conoce como homoiconic.
Si asignamos una expresión lambda a una variable de tipo delegado, el compilador generará un código ejecutable de ello. Sin embargo, si asignamos la expresión lambda a una variable del tipo genérico Expression, el compilador no la traducirá a código ejecutable, sino que generará una estructura de datos en memoria que representa a la expresión en sí. Estas estructuras de datos es la que en C# se denomina árboles de expresiones.
Una vez que se ha construido un árbol de expresión, este puede ser manipulado, modificado, seriado y distribuido a través de la red. Cabe destacar que contamos con todos los mecanismos necesarios para la compilación de arboles de expresiones gracias a la clase Expression.
Entre los elementos más importantes descendientes de la clase Expression contamos con los siguientes:
1) Lambda Expression: Sirve como un puente entre la clase Expression
2) ParameterExpression: Mediante los objetos de este tipo se representan los parámetros de una expresión. La propiedad principal de este objeto es Name o nombre del parámetro.
3) ConstantExpression: Mediante este objeto se representan valores de tipo de tipo constantes de una expresión determinada.
Referencias: http://www.elguille.info/NET/futuro/firmas_octavio_ArbolesExpresiones.htm