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