private static QualifiedMember CreateMember(
            Expression memberAccessExpression,
            Func <Type, Member> rootMemberFactory,
            Func <Type, IList <Member> > membersFactory,
            Action <ExpressionType> nonMemberAction,
            MapperContext mapperContext)
        {
            var memberAccesses = memberAccessExpression.GetMemberAccessChain(nonMemberAction, out var rootExpression);

            if (memberAccesses.None())
            {
                return(null);
            }

            var rootMember   = rootMemberFactory.Invoke(rootExpression.Type);
            var parentMember = rootMember;

            var memberChain = new Member[memberAccesses.Count + 1];

            memberChain[0] = rootMember;

            for (var i = 0; i < memberAccesses.Count;)
            {
                var memberAccess = memberAccesses[i];
                var memberName   = GetMemberName(memberAccess);
                var members      = membersFactory.Invoke(parentMember.Type);
                var member       = members.FirstOrDefault(memberName, (mn, m) => m.Name == mn);

                if (member == null)
                {
                    return(null);
                }

                memberChain[++i] = member;
                parentMember     = member;
            }

            return(QualifiedMember.Create(memberChain, mapperContext));
        }