Ho questo codice che produce un delegato che moltiplica myNumber per 5
ParameterExpression numParam = Expression.Parameter(typeof(int), "num");
ConstantExpression five = Expression.Constant(5, typeof(int));
BinaryExpression numMultiply = Expression.Multiply(numParam,five);
Consente di creare il delegato:
Expression<Func<int, int>> lambda1 =
Expression.Lambda<Func<int, int>>(
numMultiply,
new ParameterExpression[] { numParam });
Console.Write(lambda1.Compile()(4));
ora diciamo che voglio cambiare questo albero di espressioni da Add
invece di Multiply
ecco la nuova linea:
BinaryExpression numAdd = Expression.Add(numParam,five);
Ma come posso cambiare lambda1 in modo che ora userà numAdd
invece di multiply
?
Ne crei uno nuovo e lo compili.
Expression<Func<int, int>> lambda1 =
Expression.Lambda<Func<int, int>>(
numAdd,
new ParameterExpression[] { numParam });
Dalla pagina MSDN :
Gli alberi di espressione dovrebbero essere immutabili. Ciò significa che se si desidera modificare un albero di espressioni, è necessario costruire un nuovo albero di espressioni copiando quello esistente e sostituendo i nodi in esso. È possibile utilizzare un visitatore dell'albero dell'espressione per attraversare l'albero dell'espressione esistente.
La frase "dovrebbe essere" è un po 'strana, ma quando guardi l'API vedrai che tutte le proprietà rilevanti (Corpo, Sinistra, Destra) sono di sola lettura.