public void ForContinue() { var counter = new Counter(); var c = Expression.Parameter(typeof(Counter), "c"); var l = Expression.Parameter(typeof(int), "l"); var i = Expression.Variable(typeof(int), "i"); var for_break = Expression.Label("for_break"); var for_continue = Expression.Label("for_continue"); var hitcounter = Expression.Lambda <Action <Counter, int> >( ExpressionEx.For( i, Expression.Constant(0), Expression.LessThan(i, l), Expression.PreIncrementAssign(i), Expression.Block( Expression.Condition( Expression.Equal(Expression.Modulo(i, Expression.Constant(2)), Expression.Constant(0)), Expression.Call(c, typeof(Counter).GetMethod("Hit", Type.EmptyTypes)), Expression.Goto(for_continue))), for_break, for_continue), c, l).Compile(); hitcounter(counter, 10); Assert.Equal(5, counter.Count); }
public void For() { var l = Expression.Parameter(typeof(int), "l"); var i = Expression.Variable(typeof(int), "i"); var lambda = Expression.Lambda <Action <int> >( ExpressionEx.For( i, Expression.Constant(0), Expression.LessThan(i, l), Expression.PreIncrementAssign(i), Expression.Call(typeof(Console).GetMethod("WriteLine", new[] { typeof(int) }), i)), l); AssertExpression(@" void (int l) { for (int i = 0; i < l; ++i) { Console.WriteLine(i); } } ", lambda); }
public void Never() { var counter = new Counter(); var c = Expression.Parameter(typeof(Counter), "c"); var l = Expression.Parameter(typeof(int), "l"); var i = Expression.Variable(typeof(int), "i"); var hitcounter = Expression.Lambda <Action <Counter, int> >( ExpressionEx.For( i, Expression.Constant(0), Expression.LessThan(i, l), Expression.PreIncrementAssign(i), Expression.Call(c, typeof(Counter).GetMethod("Hit", Type.EmptyTypes))), c, l).Compile(); hitcounter(counter, 0); Assert.Equal(0, counter.Count); }