コード例 #1
0
        public void ForBreak()
        {
            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 hitcounter = Expression.Lambda <Action <Counter, int> > (
                CustomExpression.For(
                    i,
                    Expression.Constant(0),
                    Expression.LessThan(i, l),
                    Expression.PreIncrementAssign(i),
                    Expression.Block(
                        Expression.Condition(
                            Expression.LessThan(i, Expression.Constant(10)),
                            Expression.Call(c, typeof(Counter).GetMethod("Hit", Type.EmptyTypes)),
                            Expression.Goto(for_break))),
                    for_break),
                c, l).Compile();

            hitcounter(counter, 100);

            Assert.AreEqual(10, counter.Count);
        }
コード例 #2
0
        public void ForVisit()
        {
            var i            = Expression.Variable(typeof(int), "i");
            var for_break    = Expression.Label("for_break");
            var for_continue = Expression.Label("for_continue");

            var forExpression = CustomExpression.For(
                i,
                Expression.Constant(0),
                Expression.LessThan(i, Expression.Constant(1)),
                Expression.PreIncrementAssign(i),
                Expression.Constant(null),
                for_break,
                for_continue);
            var visitedForExpression = (ForExpression)(new ReplaceNullByDefaultVisitor().Visit(forExpression));

            Assert.AreNotEqual(forExpression, visitedForExpression);

            Assert.AreEqual(forExpression.Variable, visitedForExpression.Variable);
            Assert.AreEqual(forExpression.Initializer, visitedForExpression.Initializer);
            Assert.AreEqual(forExpression.Test, visitedForExpression.Test);
            Assert.AreEqual(forExpression.Step, visitedForExpression.Step);
            Assert.AreEqual(ExpressionType.Default, visitedForExpression.Body.NodeType);
            Assert.AreEqual(forExpression.BreakTarget, visitedForExpression.BreakTarget);
            Assert.AreEqual(forExpression.ContinueTarget, visitedForExpression.ContinueTarget);
        }
コード例 #3
0
        public void For()
        {
            var l = Expression.Parameter(typeof(int), "l");

            var i = Expression.Variable(typeof(int), "i");

            var lambda = Expression.Lambda <Action <int> > (
                CustomExpression.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);
        }
コード例 #4
0
ファイル: ForExpression.cs プロジェクト: veboys/UIForia
        public ForExpression Update(ParameterExpression variable, Expression initializer, Expression test, Expression step, Expression body, LabelTarget breakTarget, LabelTarget continueTarget)
        {
            if (this.variable == variable && this.initializer == initializer && this.test == test && this.step == step && this.body == body && this.break_target == breakTarget && this.continue_target == continueTarget)
            {
                return(this);
            }

            return(CustomExpression.For(variable, initializer, test, step, body, breakTarget, continueTarget));
        }
コード例 #5
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> > (
                CustomExpression.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.AreEqual(0, counter.Count);
        }