public static SourceMemberMatch GetMatchFor(SourceMemberMatchContext context)
        {
            if (context.ParentSourceMember.IsSimple)
            {
                return(SourceMemberMatch.Null);
            }

            if (ExactMemberMatchExists(context))
            {
                return(context.CreateSourceMemberMatch());
            }

            if (TryFindSourceMemberMatch(context) || TryFindParentContextSourceMemberMatch(context))
            {
                return(context.SourceMemberMatch);
            }

            return((context.MatchingSourceMember != null)
                ? context.CreateSourceMemberMatch(isUseable: false)
                : SourceMemberMatch.Null);
        }
        private static bool TryFindSourceMemberMatch(SourceMemberMatchContext context)
        {
            var candidateSourceMembers = EnumerateSourceMembers(context)
                                         .Filter(context.TargetMember.Matches);

            foreach (var sourceMember in candidateSourceMembers)
            {
                if (TypesAreCompatible(sourceMember.Type, context.MemberMapperData))
                {
                    context.SourceMemberMatch = context.CreateSourceMemberMatch(sourceMember);
                    return(true);
                }

                if (context.MatchingSourceMember == null)
                {
                    context.MatchingSourceMember = sourceMember;
                }
            }

            return(false);
        }