¿Cambiar cuerpo delegado de expresión en tiempo de ejecución?

.net .net-4.0 c# expression-trees

Pregunta

Tengo este código que produce un delegado que multiplica miNúmero por 5

ParameterExpression numParam = Expression.Parameter(typeof(int), "num");
ConstantExpression five = Expression.Constant(5, typeof(int));
BinaryExpression numMultiply = Expression.Multiply(numParam,five);

Permite crear el delegado:

Expression<Func<int, int>> lambda1 =
    Expression.Lambda<Func<int, int>>(
        numMultiply,
        new ParameterExpression[] { numParam });
Console.Write(lambda1.Compile()(4));

ahora digamos que quiero cambiar este árbol de expresiones a Add lugar de Multiply
Aquí está la nueva línea:

BinaryExpression numAdd = Expression.Add(numParam,five);

Pero, ¿cómo puedo cambiar la lambda1 para que ahora use numAdd lugar de multiply ?

Respuesta aceptada

Solo construyes uno nuevo y lo compilas.

Expression<Func<int, int>> lambda1 =
     Expression.Lambda<Func<int, int>>(
         numAdd,
         new ParameterExpression[] { numParam });

Desde la página de MSDN :

Los árboles de expresión deben ser inmutables. Esto significa que si desea modificar un árbol de expresiones, debe construir un nuevo árbol de expresiones copiando el existente y reemplazando los nodos en él. Puede utilizar un visitante del árbol de expresiones para recorrer el árbol de expresiones existente.

La frase "debería ser" es un poco extraña, pero cuando mire la API verá que todas las propiedades relevantes (Cuerpo, Izquierda, Derecha) son de solo lectura.



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