private static bool TryFindParentContextSourceMemberMatch(SourceMemberMatchContext context)
        {
            if (!context.SearchParentContexts)
            {
                return(false);
            }

            var mappingData = context.MemberMappingData.Parent;

            while (mappingData.Parent != null)
            {
                if (mappingData.MapperData.IsEntryPoint ||
                    mappingData.MapperData.TargetMemberIsEnumerableElement())
                {
                    break;
                }

                mappingData = mappingData.Parent;

                var childMapperData    = new ChildMemberMapperData(context.TargetMember, mappingData.MapperData);
                var contextMappingData = mappingData.GetChildMappingData(childMapperData);

                if (TryFindSourceMemberMatch(context.With(contextMappingData)))
                {
                    return(true);
                }
            }

            return(false);
        }
        private static IEnumerable <IQualifiedMember> EnumerateSourceMembers(SourceMemberMatchContext context)
        {
            yield return(context.ParentSourceMember);

            if (!context.ParentSourceMember.CouldMatch(context.TargetMember))
            {
                yield break;
            }

            var parentMemberType = context.MemberMappingData.Parent
                                   .GetSourceMemberRuntimeType(context.ParentSourceMember);

            if (parentMemberType != context.ParentSourceMember.Type)
            {
                context.With(context.ParentSourceMember.WithType(parentMemberType));
                yield return(context.ParentSourceMember);

                if (context.ParentSourceMember.IsSimple)
                {
                    yield break;
                }
            }

            var relevantChildSourceMembers = QuerySourceMembers(context, MembersHaveCompatibleTypes);

            foreach (var childMember in relevantChildSourceMembers)
            {
                if (childMember.IsSimple)
                {
                    yield return(childMember);

                    continue;
                }

                foreach (var qualifiedMember in EnumerateSourceMembers(context.With(childMember)))
                {
                    yield return(qualifiedMember);
                }
            }
        }