using System.Linq.Expressions;
using System.Collections;
using System.Collections.Generic;
public static void Main()
Console.WriteLine("****************** C# Equivalent Output **************************\n\n");
for (int cLoopVar = initValue; cLoopVar < maxValue; cLoopVar++)
Console.WriteLine(cLoopVar);
Console.WriteLine("\n\n***************** Expression Tree Output **************************\n\n");
var loopVar = Expression.Parameter(typeof(int), "loopVar");
var loopBody = Expression.Call(typeof(Console).GetMethod("WriteLine", new[] { typeof(int) }), loopVar);
var initValueExpr = Expression.Constant(initValue);
var incrementExpr = Expression.PostIncrementAssign(loopVar);
var conditionExpr = Expression.LessThan(loopVar, Expression.Constant(maxValue));
var loop = For(loopVar, initValueExpr, conditionExpr, incrementExpr, loopBody);
var result = Expression.Lambda<Action<int>>(loop, loopVar).Compile();
public static Expression For(ParameterExpression loopVar, Expression initValue, Expression condition, Expression increment, Expression loopContent)
var initAssign = Expression.Assign(loopVar, initValue);
var breakLabel = Expression.Label("LoopBreak");
var ifThenElseExpr = Expression.IfThenElse(
Expression.Break(breakLabel)
var loop = Expression.Loop(ifThenElseExpr, breakLabel);
var block = Expression.Block(new[] { loopVar },