using System.Collections.Generic;
using System.Threading.Tasks;
using System.Linq.Expressions;
namespace LISTING_2_59_Modifying_an_expression_tree
public class MultiplyToAdd : ExpressionVisitor
public Expression Modify(Expression expression)
return Visit(expression);
protected override Expression VisitBinary(BinaryExpression b)
if (b.NodeType == ExpressionType.Multiply)
Expression left = this.Visit(b.Left);
Expression right = this.Visit(b.Right);
return Expression.Add(left, right);
return base.VisitBinary(b);
public static void Main(string[] args)
ParameterExpression numParam = Expression.Parameter(typeof(int), "num");
BinaryExpression squareOperation = Expression.Multiply(numParam, numParam);
Expression<Func<int, int>> square =
Expression.Lambda<Func<int, int>>(
new ParameterExpression[] { numParam });
Func<int, int> doSquare = square.Compile();
Console.WriteLine("Square of 4: {0}", doSquare(4));
MultiplyToAdd m = new MultiplyToAdd();
Expression<Func<int, int>> addExpression = (Expression<Func<int, int>>)m.Modify(square);
Func<int, int> doAdd = addExpression.Compile();
Console.WriteLine("Double of 4: {0}", doAdd(4));