Un poco curioso para entender el árbol de expresiones en .NET

c# expression expression-trees

Pregunta

He leído varios artículos y varias publicaciones de stackoverflow.com sobre el árbol de expresiones. Está latiendo mi cerebro para entender.

Preguntas:

1) Al igual que DOM (Document Object Model), ¿es una representación de lógica en memoria?

2) Alguien explicó que es un mecanismo para traducir un código ejecutable en datos, al usarlo podemos producir una estructura de datos que representa el código.

¿Significa que los árboles de expresión se utilizan para diseñar un patrón definido por el usuario?

3) La mayoría de los Ejemplos muestran el árbol de Expresión en conjunto con el delegado Func<> u otros delegados, por lo tanto, al usar delegado y otra construcción de programación no podemos lograr lo mismo que sirve el árbol de expresión.

La explicación comprensible para los principiantes es muy apreciada.

Respuesta aceptada

El árbol de expresiones representa un árbol de sintaxis de una sola expresión.

Cada nodo del árbol representa alguna constante, referencia de miembro de objeto u operación.

Por ejemplo, para la expresión 2 + 3 podemos construir un árbol de expresión:

Expression.MakeBinary(
    ExpressionType.Add,
    Expression.Constant(2),
    Expression.Constant(3));

El más importante de estos árboles es la expresión, que permite escribir expresiones de forma legible, recordando las funciones lambda de la firma que coincide con TDelegate. Aquí ex

Expression<Func<int>> sum = () => 2 + 3; // much nicer, eh?

Pero Expression no es delegado, ya que no se pudo ejecutar directamente.

En su lugar, se puede recorrer, por ejemplo, con un objeto visitante para construir una representación ejecutable. Los ejemplos podrían ser la creación delegada con Expression.Compile () o la consulta SQL creada a partir de una consulta LINQ utilizando CompiledQuery.Compile (), etc.

Otra aplicación útil de los árboles de expresión es usarlos para representar miembros de objetos que de otra manera requerirían el uso de Reflection. Reflection utiliza cadenas para representar nombres de miembros y no realiza comprobaciones en tiempo de compilación. Los árboles de expresión están marcados, por lo que se podrían cometer menos errores.

PropertyInfo prop1 = typeof(MyClass).GetProperty("Value");

Expression<Func<MyClass, int>> expr = mc => mc.Value;
PropertyInfo prop2 = (mc.Body as MemberExpression).Member as PropertyInfo;

Respuesta experta

Expression es una forma versátil de expresar operaciones de código como un modelo de objeto. Esto se extiende mucho más en 4.0, pero esta es un área que uso mucho ; Tengo algunos puntos de blog aquí , u otro intento de explicarlo todo en InfoQ . También presenté este tema varias veces, tal vez intente la descarga aquí (pero no tendrá mucho sentido sin las palabras; lo siento).

Seré honesto; no es un tema simple, pero es enormemente poderoso cuando lo asimilas. De lo anterior, probablemente comenzaría con el InfoQ.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow