public void WhileBreakContinue()
        {
            var counter = new Counter();

            var c = Expression.Parameter(typeof(Counter), "c");
            var i = Expression.Parameter(typeof(int), "i");
            var l = Expression.Parameter(typeof(int), "l");

            var loopBreak    = Expression.Label("for_break");
            var loopContinue = Expression.Label("for_continue");

            var hitcounter = Expression.Lambda <Action <Counter, int, int> >(
                ExpressionEx.While(
                    Expression.LessThan(i, l),
                    Expression.Block(
                        Expression.Condition(
                            Expression.LessThan(i, Expression.Constant(10)),
                            Expression.Block(
                                Expression.Call(c, typeof(Counter).GetMethod("Hit", Type.EmptyTypes)),
                                Expression.PostIncrementAssign(i),
                                Expression.Goto(loopContinue)),
                            Expression.Goto(loopBreak))),
                    loopBreak,
                    loopContinue),
                c, i, l).Compile();

            hitcounter(counter, 0, 100);

            Assert.Equal(10, counter.Count);
        }
        public void WhileFalse()
        {
            var counter = new Counter();

            var c = Expression.Parameter(typeof(Counter), "c");
            var i = Expression.Parameter(typeof(int), "i");
            var l = Expression.Parameter(typeof(int), "l");

            var hitcounter = Expression.Lambda <Action <Counter, int, int> >(
                ExpressionEx.While(
                    Expression.LessThan(i, l),
                    Expression.Block(
                        Expression.Call(c, typeof(Counter).GetMethod("Hit", Type.EmptyTypes)),
                        Expression.PreIncrementAssign(i))
                    ),
                c, i, l).Compile();

            hitcounter(counter, 100, 10);

            Assert.Equal(0, counter.Count);
        }
        public void While()
        {
            var i = Expression.Parameter(typeof(int), "i");
            var l = Expression.Parameter(typeof(int), "l");

            var lambda = Expression.Lambda <Action <int, int> >(
                ExpressionEx.While(
                    Expression.LessThan(i, l),
                    Expression.Block(
                        Expression.Call(typeof(Console).GetMethod("WriteLine", new[] { typeof(int) }), Expression.PostIncrementAssign(i)))),
                i, l);

            AssertExpression(@"
void (int i, int l)
{
	while (i < l)
	{
		Console.WriteLine(i++);
	}
}
", lambda);
        }