Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }