Example #1
0
        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);
        }
Example #2
0
        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);
                }
            }
        }