public void DoWhileBreakContinue()
        {
            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.DoWhile(
                    Expression.LessThan(i, l),
                    Expression.Block(
                        Expression.Condition(
                            Expression.LessThan(i, Expression.Constant(10)),
                            Expression.Block(
                                Expression.Call(c, typeof(Counter).GetMethod(nameof(Counter.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 DoWhileFalse()
        {
            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.DoWhile(
                    Expression.LessThan(i, l),
                    Expression.Block(
                        Expression.Call(c, typeof(Counter).GetMethod(nameof(Counter.Hit), Type.EmptyTypes) !),
                        Expression.PreIncrementAssign(i))
                    ),
                c, i, l).Compile();

            hitcounter(counter, 100, 10);

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

            var lambda = Expression.Lambda <Action <int, int> >(
                ExpressionEx.DoWhile(
                    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)
{
	do
	{
		Console.WriteLine(i++);
	}
	while (i < l);
}
", lambda);
        }