Exemple #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));
        }
        public static Expression <Func <TSecondSource, TResult> > ReplaceParameter <TSource, TSecondSource, TResult>(this Expression <Func <TSource, TResult> > sourceExpression, Expression <Func <TSecondSource, TSource> > member)
        {
            ExpressionVisitor rebinder = new MemberRebinder(sourceExpression.Parameters[0], (MemberExpression)member.Body);

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

            return(Expression.Lambda <Func <TSecondSource, TResult> >(resultBody, member.Parameters[0]));
        }