Ejemplo n.º 1
0
 private bool IsShallowCopy(MemberDescriptor from, MemberDescriptor to)
 {
     return(IsShallowCopy(from.MemberType, to.MemberType));
 }
Ejemplo n.º 2
0
 public MappingItem(MemberDescriptor from, MemberDescriptor to, bool shallowCopy)
 {
     From        = from;
     To          = to;
     ShallowCopy = shallowCopy;
 }
Ejemplo n.º 3
0
        private IMappingOperation CreateMappingOperation(
            HashSet <TypesPair> processedTypes,
            Type fromRoot,
            Type toRoot,
            IEnumerable <MemberInfo> toPath,
            IEnumerable <MemberInfo> fromPath,
            MemberInfo fromMi,
            MemberInfo toMi
            )
        {
            var origDestMemberDescr = new MemberDescriptor(toPath.Concat(new[] { toMi }).ToArray());
            var origSrcMemberDescr  = new MemberDescriptor(fromPath.Concat(new[] { fromMi }).ToArray());

            if (ReflectionUtils.IsNullable(ReflectionUtils.GetMemberType(fromMi)))
            {
                fromPath = fromPath.Concat(new[] { fromMi });
                fromMi   = ReflectionUtils.GetMemberType(fromMi).GetProperty("Value");
            }
            if (ReflectionUtils.IsNullable(ReflectionUtils.GetMemberType(toMi)))
            {
                toPath = fromPath.Concat(new[] { toMi });
                toMi   = ReflectionUtils.GetMemberType(toMi).GetProperty("Value");
            }

            var  destMemberDescr = new MemberDescriptor(toPath.Concat(new[] { toMi }).ToArray());
            var  srcMemberDescr  = new MemberDescriptor(fromPath.Concat(new[] { fromMi }).ToArray());
            Type typeFromMember  = srcMemberDescr.MemberType;
            Type typeToMember    = destMemberDescr.MemberType;

            bool shallowCopy = IsShallowCopy(srcMemberDescr, destMemberDescr);

            if (
                IsNativeDeepCopy(typeFromMember, typeToMember, srcMemberDescr.MemberInfo, destMemberDescr.MemberInfo, shallowCopy) &&
                !processedTypes.Contains(new TypesPair(typeFromMember, typeToMember))
                )
            {
                return
                    (new ReadWriteComplex()
                {
                    Destination = origDestMemberDescr,
                    Source = origSrcMemberDescr,
                    ShallowCopy = shallowCopy,
                    Operations =
                        GetMappingItems(
                            processedTypes,
                            srcMemberDescr.MemberType,
                            destMemberDescr.MemberType,
                            null,
                            null
                            )
                });
            }
            else
            {
                return
                    (new ReadWriteSimple()
                {
                    Source = origSrcMemberDescr,
                    Destination = origDestMemberDescr,
                    ShallowCopy = shallowCopy,
                });
            }
        }