Example #1
0
            static Func <TEnumerable, int> CountCustom()
            {
                var enumerableParameter = Expression.Parameter(typeof(TEnumerable), "source");
                var enumeratorVariable  = Expression.Variable(typeof(TEnumerator), "enumerator");
                var counterVariable     = Expression.Variable(typeof(int), "counter");
                var body = Expression.Block(new[] { enumeratorVariable, counterVariable },
                                            Expression.Assign(counterVariable, Expression.Constant(0)),
                                            Expression.Assign(enumeratorVariable, Expression.Call(enumerableParameter, "GetEnumerator", null)),
                                            ExpressionEx.Using(enumeratorVariable,
                                                               ExpressionEx.While(
                                                                   Expression.Call(enumeratorVariable, typeof(IEnumerator).GetMethod("MoveNext")),
                                                                   Expression.Assign(counterVariable, Expression.Increment(counterVariable)))),
                                            counterVariable);

                return(Expression.Lambda <Func <TEnumerable, int> >(body, enumerableParameter).Compile());
            }
Example #2
0
        static Func <IEnumerable, int> CreateCount(Type enumerableType)
        {
            var enumeratorType = enumerableType
                                 .GetMethod("GetEnumerator", BindingFlags.Instance | BindingFlags.Public)
                                 .ReturnType;

            var enumerableParameter = Expression.Parameter(enumerableType, "source");
            var enumeratorVariable  = Expression.Variable(enumeratorType, "enumerator");
            var counterVariable     = Expression.Variable(typeof(int), "counter");
            var body = Expression.Block(new[] { enumeratorVariable, counterVariable },
                                        Expression.Assign(counterVariable, Expression.Constant(0)),
                                        Expression.Assign(enumeratorVariable, Expression.Call(enumerableParameter, "GetEnumerator", null)),
                                        ExpressionEx.Using(enumeratorVariable,
                                                           ExpressionEx.While(
                                                               Expression.Call(enumeratorVariable, typeof(IEnumerator).GetMethod("MoveNext")),
                                                               Expression.Assign(counterVariable, Expression.Increment(counterVariable)))),
                                        counterVariable);

            return(Expression.Lambda <Func <IEnumerable, int> >(body, enumerableParameter).Compile());
        }