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