예제 #1
0
        public static Expression <Func <TSource, TResult> > Combine <TSource, TResult>(this IEnumerable <Expression <Func <TSource, TResult> > > expresions, Func <Expression, Expression, Expression> combineOperator)
        {
            ParameterExpression parameter  = null;
            Expression          resultBody = null;

            foreach (var expression in expresions)
            {
                if (resultBody == null)
                {
                    resultBody = expression.Body;
                    parameter  = expression.Parameters[0];
                }
                else
                {
                    Expression expressionBody = expression.Body;

                    ParameterExpression expressionParameter = expression.Parameters[0];

                    var rebinder = new ParameterRebinder(expressionParameter, parameter);
                    expressionBody = rebinder.Visit(expressionBody);

                    resultBody = combineOperator(resultBody, expressionBody);
                }
            }

            if (resultBody == null)
            {
                throw new ArgumentException("Expressions Enumerable is empty", "expresions");
            }

            return(Expression.Lambda <Func <TSource, TResult> >(resultBody, parameter));
        }
        internal static Expression ReplaceParameter(this Expression sourceExpression, ParameterExpression replaceParam, ParameterExpression parameter)
        {
            ExpressionVisitor rebinder = new ParameterRebinder(replaceParam, parameter);

            return(rebinder.Visit(sourceExpression));
        }