Exemple #1
0
        public ReflectionMapperProfile(params Assembly[] assemblies)
        {
            IEnumerable <Type> assembyTypes = assemblies.SelectMany(assembly => assembly.GetTypes());

            MethodInfo createMap = this.GetType().GetMethods().Where(method => method.Name == nameof(base.CreateMap) && method.IsGenericMethod && method.GetParameters().Length == 0).First();

            Type mapConfigType = typeof(MapConfig <,>);

            foreach (MapType mapType in GetMapTypes(assembyTypes))
            {
                Type dto             = mapType.DTO;
                Type entity          = mapType.Entity;
                var  dtoEntityConfig = assembyTypes.Where(x => x.IsSubclassOf(mapConfigType.MakeGenericType(dto, entity))).FirstOrDefault();

                if (dtoEntityConfig != null)
                {
                    object dto2Entity     = createMap.MakeGenericMethod(dto, entity).Invoke(this, null);
                    object entity2DTO     = createMap.MakeGenericMethod(entity, dto).Invoke(this, null);
                    object mapToConfigDto = Activator.CreateInstance(dtoEntityConfig);

                    Type invokeMapToConfigType       = typeof(MapConfig <,>).MakeGenericType(dto, entity);
                    IInvokeMapToConfig invokeMapping = (IInvokeMapToConfig)Activator.CreateInstance(invokeMapToConfigType, new object[] { mapToConfigDto, dto2Entity, entity2DTO });
                    invokeMapping.Invoke();
                }
            }
        }
        private static void InvokeMapConfig(IEnumerable <Type> assembyTypes, object dto2Entity, object entity2DTO, Type dto, Type entity)
        {
            Type mapConfigType   = typeof(MapConfig <,>);
            Type dtoEntityConfig = assembyTypes.Where(x => x.IsSubclassOf(mapConfigType.MakeGenericType(dto, entity))).FirstOrDefault();

            if (dtoEntityConfig != null)
            {
                object mapToConfig = Activator.CreateInstance(dtoEntityConfig);

                Type invokeMapToConfigType       = typeof(InvokeMapToConfig <,>).MakeGenericType(dto, entity);
                IInvokeMapToConfig invokeMapping = (IInvokeMapToConfig)Activator.CreateInstance(invokeMapToConfigType, new[] { mapToConfig, dto2Entity, entity2DTO });
                invokeMapping.Invoke();
            }
        }