private MapperCacheItem CreateMapperCacheItem(TypePair typePair)
        {
            MapperBuilder   mapperBuilder   = GetMapperBuilder(typePair);
            Mapper          mapper          = mapperBuilder.Build(typePair);
            MapperCacheItem mapperCacheItem = _mapperCache.Add(typePair, mapper);

            return(mapperCacheItem);
        }
예제 #2
0
        private MapperCacheItem CreateMapperCacheItem(TypePair parentTypePair, MappingMember mappingMember)
        {
            MapperBuilder   mapperBuilder   = _config.GetMapperBuilder(parentTypePair, mappingMember);
            Mapper          mapper          = mapperBuilder.Build(parentTypePair, mappingMember);
            MapperCacheItem mapperCacheItem = _mapperCache.Add(mappingMember.TypePair, mapper);

            return(mapperCacheItem);
        }
        private void EmitConvertItem(TypeBuilder typeBuilder, TypePair typePair, string methodName = ConvertItemMethod)
        {
            MapperCacheItem mapperCacheItem = CreateMapperCacheItem(typePair);

            MethodBuilder methodBuilder = typeBuilder.DefineMethod(methodName, OverrideProtected, typeof(object), new[] { typeof(object) });

            IEmitterType sourceMemeber = EmitArgument.Load(typeof(object), 1);
            IEmitterType targetMember  = EmitNull.Load();

            IEmitterType callMapMethod = mapperCacheItem.EmitMapMethod(sourceMemeber, targetMember);

            EmitReturn.Return(callMapMethod).Emit(new CodeGenerator(methodBuilder.GetILGenerator()));
        }
예제 #4
0
        private IEmitterType ConvertMember(MappingMember member, IEmitterType sourceMemeber, IEmitterType targetMember)
        {
            if (member.TypePair.IsDeepCloneable)
            {
                return(sourceMemeber);
            }

            MapperCacheItem mapperCacheItem = CreateMapperCacheItem(member.TypePair);

            IEmitterType result = mapperCacheItem.EmitMapMethod(sourceMemeber, targetMember);

            return(result);
        }
예제 #5
0
        private IEmitterType ConvertMember(TypePair parentTypePair, MappingMember member, IEmitterType sourceMemeber, IEmitterType targetMember)
        {
            //            if (member.TypePair.IsDeepCloneable && _config.GetBindingConfig(parentTypePair).HasNoValue)
            if (member.TypePair.IsDeepCloneable)
            {
                return(sourceMemeber);
            }

            MapperCacheItem mapperCacheItem = CreateMapperCacheItem(parentTypePair, member);

            IEmitterType result = mapperCacheItem.EmitMapMethod(sourceMemeber, targetMember);

            return(result);
        }
예제 #6
0
        private MapperCacheItem CreateMapperCacheItem(TypePair parentTypePair, MappingMember mappingMember)
        {
            var mapperCacheItemOption = _mapperCache.Get(mappingMember.TypePair);

            if (mapperCacheItemOption.HasValue)
            {
                return(mapperCacheItemOption.Value);
            }

            MapperBuilder   mapperBuilder   = _config.GetMapperBuilder(parentTypePair, mappingMember);
            Mapper          mapper          = mapperBuilder.Build(parentTypePair, mappingMember);
            MapperCacheItem mapperCacheItem = _mapperCache.Add(mappingMember.TypePair, mapper);

            return(mapperCacheItem);
        }
        private MapperCacheItem CreateMapperCacheItem(TypePair typePair)
        {
            var mapperCacheItemOption = _mapperCache.Get(typePair);

            if (mapperCacheItemOption.HasValue)
            {
                return(mapperCacheItemOption.Value);
            }

            MapperBuilder   mapperBuilder   = GetMapperBuilder(typePair);
            Mapper          mapper          = mapperBuilder.Build(typePair);
            MapperCacheItem mapperCacheItem = _mapperCache.Add(typePair, mapper);

            return(mapperCacheItem);
        }
예제 #8
0
        protected override Mapper BuildCore(TypePair typePair)
        {
            Type        parentType  = typeof(ClassMapper <,>).MakeGenericType(typePair.Source, typePair.Target);
            TypeBuilder typeBuilder = _assembly.DefineType(GetMapperFullName(), parentType);

            EmitCreateTargetInstance(typePair.Target, typeBuilder);

            MapperCacheItem      rootMapperCacheItem = _mapperCache.AddStub(typePair);
            Option <MapperCache> mappers             = EmitMapClass(typePair, typeBuilder);

            var rootMapper = (Mapper)Activator.CreateInstance(Helpers.CreateType(typeBuilder));

            UpdateMappers(mappers, rootMapperCacheItem.Id, rootMapper);

            _mapperCache.ReplaceStub(typePair, rootMapper);

            mappers.Do(x => rootMapper.AddMappers(x.Mappers));

            return(rootMapper);
        }