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)); }