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); }