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(); } }