private static IEnumerable <IQualifiedMember> EnumerateSourceMembers( IQualifiedMember parentMember, IChildMemberMappingData rootData) { yield return(parentMember); if (!parentMember.CouldMatch(rootData.MapperData.TargetMember)) { yield break; } var parentMemberType = rootData.Parent.GetSourceMemberRuntimeType(parentMember); if (parentMemberType != parentMember.Type) { parentMember = parentMember.WithType(parentMemberType); yield return(parentMember); if (parentMember.IsSimple) { yield break; } } var relevantSourceMembers = QuerySourceMembers( parentMember, rootData, MembersHaveCompatibleTypes); foreach (var sourceMember in relevantSourceMembers) { var childMember = parentMember.Append(sourceMember); if (sourceMember.IsSimple) { yield return(childMember); continue; } foreach (var qualifiedMember in EnumerateSourceMembers(childMember, rootData)) { yield return(qualifiedMember); } } }
private static IEnumerable <IQualifiedMember> GetAllSourceMembers( IQualifiedMember parentMember, IChildMemberMappingData rootData) { yield return(parentMember); if (!parentMember.CouldMatch(rootData.MapperData.TargetMember)) { yield break; } var parentMemberType = rootData.GetSourceMemberRuntimeType(parentMember); if (parentMemberType != parentMember.Type) { parentMember = parentMember.WithType(parentMemberType); yield return(parentMember); } var relevantMembers = GlobalContext .Instance .MemberFinder .GetSourceMembers(parentMember.Type) .Where(m => (m.IsSimple && rootData.MapperData.TargetMember.IsSimple) || !m.IsSimple); foreach (var sourceMember in relevantMembers) { var childMember = parentMember.Append(sourceMember); if (sourceMember.IsSimple) { yield return(childMember); continue; } foreach (var qualifiedMember in GetAllSourceMembers(childMember, rootData)) { yield return(qualifiedMember); } } }
private static bool ExactMatchingSourceMemberExists( IQualifiedMember parentSourceMember, IChildMemberMappingData targetData, out IQualifiedMember matchingMember) { var sourceMember = QuerySourceMembers( parentSourceMember, targetData, MembersMatch) .FirstOrDefault(); if ((sourceMember == null) || !TypesAreCompatible(sourceMember.Type, targetData.MapperData)) { matchingMember = null; return(false); } matchingMember = parentSourceMember.Append(sourceMember); return(true); }
public static IQualifiedMember GetElementMember(this IQualifiedMember enumerableMember) => enumerableMember.Append(GetElementMember(enumerableMember.Type));