public Expression <Func <TSource, TDestination> > CombineIntoMapperWithConstructor( Expression <Func <TSource, TDestination> > recipientExpression, Expression <Func <TSource, TDestination> > donorExpression) { var paramReplacer = new ParameterReplacerVisitor( donorExpression.Parameters[0], recipientExpression.Parameters[0]); var donorWithCorrectedParam = (Expression <Func <TSource, TDestination> >)paramReplacer.Visit(donorExpression); var visitor = new MemberInitBindingsCombinationVisitor <TSource, TDestination>() { recipientExpression = recipientExpression, donorExpression = donorWithCorrectedParam }; var combinedExpr = (Expression <Func <TSource, TDestination> >)visitor.Visit(recipientExpression); return(combinedExpr); }
public Expression <Action <TSource, TDestination> > CombineIntoMapperForExisting( Expression <Func <TSource, TDestination> > expressionA, Expression <Func <TSource, TDestination> > expressionB) { var bindingsA = MemberInitBindingsCombinationVisitor <TSource, TDestination> .GetBindings(expressionA); var bindingsB = MemberInitBindingsCombinationVisitor <TSource, TDestination> .GetBindings(expressionB); var paramDestination = Expression.Parameter(typeof(TDestination), "destination"); var paramSource = Expression.Parameter(typeof(TSource), "source"); BinaryExpression GetAssignment(ParameterExpression paramSourceExisting, MemberBinding binding) { var assignment = MemberInitBindingsCombinationVisitor <TSource, TDestination> .GetAssignmentFromBinding(binding, paramSourceExisting, paramSource, paramDestination); return(assignment); } var assignmentsA = bindingsA .Select(binding => GetAssignment(expressionA.Parameters[0], binding)); var assignmentsB = bindingsB .Select(binding => GetAssignment(expressionB.Parameters[0], binding)); var combinedAssignments = assignmentsA .Union(assignmentsB) .ToArray(); var body = Expression.Block(combinedAssignments); return(Expression.Lambda <Action <TSource, TDestination> >(body, new[] { paramSource, paramDestination })); }