public void StructForEachContinue()
        {
            var enumerable_counter = new StructEnumerableCounter(0, 10);

            var ec = Expression.Parameter(typeof(StructEnumerableCounter), "ec");

            var item            = Expression.Variable(typeof(int), "i");
            var foreachBreak    = Expression.Label("foreachBreak");
            var foreachContinue = Expression.Label("foreachContinue");

            var hitcounter = Expression.Lambda <Action <StructEnumerableCounter> >(
                ExpressionEx.ForEach(
                    item,
                    ec,
                    Expression.Block(
                        Expression.Condition(
                            Expression.Equal(Expression.Modulo(item, Expression.Constant(2)), Expression.Constant(0)),
                            Expression.Call(ec, typeof(StructEnumerableCounter).GetMethod("Hit", Type.EmptyTypes)),
                            Expression.Goto(foreachContinue))),
                    foreachBreak,
                    foreachContinue),
                ec).Compile();

            hitcounter(enumerable_counter);

            Assert.Equal(5, enumerable_counter.Count);
            Assert.True(enumerable_counter.Disposed);
        }
        public void StructForEachException()
        {
            var enumerable_counter = new StructEnumerableCounter(0, 100);

            var ec = Expression.Parameter(typeof(StructEnumerableCounter), "ec");

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

            var hitcounter = Expression.Lambda <Action <StructEnumerableCounter> >(
                ExpressionEx.ForEach(
                    item,
                    ec,
                    Expression.Block(
                        Expression.Condition(
                            Expression.LessThanOrEqual(item, Expression.Constant(10)),
                            Expression.Call(ec, typeof(StructEnumerableCounter).GetMethod("Hit", Type.EmptyTypes)),
                            Expression.Throw(Expression.New(typeof(TestException)))))),
                ec).Compile();

            Assert.Throws <TestException>(() =>
            {
                hitcounter(enumerable_counter);
            });

            Assert.Equal(10, enumerable_counter.Count);
            Assert.True(enumerable_counter.Disposed);
        }
        public void StructForEachEnumerable()
        {
            var enumerable_counter = new StructEnumerableCounter(0, 10);

            var ec = Expression.Parameter(typeof(StructEnumerableCounter), "ec");

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

            var hitcounter = Expression.Lambda <Action <StructEnumerableCounter> >(
                ExpressionEx.ForEach(
                    item,
                    ec,
                    Expression.Call(ec, typeof(StructEnumerableCounter).GetMethod("Hit", Type.EmptyTypes))),
                ec).Compile();

            hitcounter(enumerable_counter);

            Assert.Equal(10, enumerable_counter.Count);
            Assert.True(enumerable_counter.Disposed);
            Assert.False(enumerable_counter.DisposedIncorrectly);
        }