private static Expression GetValue( IQualifiedMember sourceMember, Expression variable, IChildMemberMappingData childMappingData) { var childMapperData = childMappingData.MapperData; if (childMapperData.TargetMember.IsSimple) { return(childMapperData .MapperContext .ValueConverters .GetConversion(variable, childMapperData.TargetMember.Type)); } var entrySourceMember = sourceMember.WithType(variable.Type); var mapping = MappingFactory.GetChildMapping( entrySourceMember, variable, 0, childMappingData); return(mapping); }
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); } } }