Example #1
0
        public static Expression <Func <TSource, TResult> > Continue <TSource, TItem, TResult>(this Expression <Func <TSource, TItem> > sourceExpression, Expression <Func <TItem, TResult> > continueExpression)
        {
            ExpressionVisitor rebinder;

            switch (sourceExpression.Body.NodeType)
            {
            case ExpressionType.MemberAccess:
            {
                rebinder = new MemberRebinder(continueExpression.Parameters[0], (MemberExpression)sourceExpression.Body);
                break;
            }

            case ExpressionType.Parameter:
            {
                rebinder = new ParameterRebinder(continueExpression.Parameters[0], (ParameterExpression)sourceExpression.Body);
                break;
            }

            default:
                rebinder = new ExpressionRebinder(continueExpression.Parameters[0], sourceExpression.Body);
                break;
            }

            Expression resultBody = rebinder.Visit(continueExpression.Body);

            return(Expression.Lambda <Func <TSource, TResult> >(resultBody, sourceExpression.Parameters));
        }
Example #2
0
        /// <summary>组合两个表达式</summary>
        public static Expression <T> Compose <T>(this Expression <T> first, Expression <T> second, Func <Expression, Expression, Expression> merge)
        {
            // build parameter map (from parameters of second to parameters of first)
            // replace parameters in the second lambda expression with parameters from the first
            // apply composition of lambda expression bodies to parameters from the first expression
            var map        = first.Parameters.Select((f, i) => new { f, s = second.Parameters[i] }).ToDictionary(p => p.s, p => p.f);
            var secondBody = ExpressionRebinder.ReplaceParameters(map, second.Body);

            return(Expression.Lambda <T>(merge(first.Body, secondBody), first.Parameters));
        }
Example #3
0
        public static Expression Continue(this Expression sourceBody, Expression continueBody, ParameterExpression continueParameter)
        {
            var rebinder = new ExpressionRebinder(continueParameter, sourceBody);

            return(rebinder.Visit(continueBody));
        }