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