public void ShouldSupportMappingFromSourceToDestination() { var typeMaps = _configuration.GetAllTypeMaps(); foreach (var map in typeMaps) { var instance = Activator.CreateInstance(map.SourceType); _mapper.Map(instance, map.SourceType, map.DestinationType); } }
public static IMappingExpression <TSource, TDestination> IgnoreAllNonExisting <TSource, TDestination>( this IMappingExpression <TSource, TDestination> expression, IConfigurationProvider configuration) { var sourceType = typeof(TSource); var destinationType = typeof(TDestination); var existingMaps = configuration.GetAllTypeMaps().First(x => x.SourceType == sourceType && x.DestinationType == destinationType); foreach (var property in existingMaps.GetUnmappedPropertyNames()) { expression.ForMember(property, opt => opt.Ignore()); } return(expression); }
/// <summary> /// 初始化映射配置 /// </summary> private static void Init(Type sourceType, Type destinationType) { if (_config == null) { _config = new MapperConfiguration(t => t.CreateMap(sourceType, destinationType)); return; } var maps = _config.GetAllTypeMaps(); _config = new MapperConfiguration(t => t.CreateMap(sourceType, destinationType)); foreach (var map in maps) { _config.RegisterTypeMap(map); } }
public void Build(Type dtoType, Type sourceType) { if (dtoType == null) { throw new ArgumentNullException(nameof(dtoType)); } if (sourceType == null) { throw new ArgumentNullException(nameof(sourceType)); } var typeMaps = _provider.GetAllTypeMaps(); var reverseMaps = new List <TypeMap>(); bool IsSourceToDto(TypeMap typeMap) { if (!dtoType.IsAssignableFrom(typeMap.DestinationType) || !sourceType.IsAssignableFrom(typeMap.SourceType)) { return(false); } reverseMaps.Add(typeMap); return(true); } bool IsDtoToSource(TypeMap typeMap) => sourceType.IsAssignableFrom(typeMap.DestinationType) && dtoType.IsAssignableFrom(typeMap.SourceType); foreach (var typeMap in typeMaps) { if (_modelDescriptorCollection.Contains(typeMap.SourceType) || IsSourceToDto(typeMap) || !IsDtoToSource(typeMap)) { continue; } var mapExpression = GetMapExpression(typeMap.SourceType, typeMap.DestinationType); var memberBindings = GetMemberBindings(mapExpression); var maps = new Dictionary <string, string>(); var properties = new List <PropertyMap>(); var modelAttrs = CombineAttributes(typeMap.SourceType.GetCustomAttributes(_options.InheritAttributes), typeMap.DestinationType.GetCustomAttributes(_options.InheritAttributes), null, null); var metadata = modelAttrs.Select(p => _metadataTransformHandler.Handle(new TransformContext(p, typeMap.SourceType, typeMap.DestinationType))) .Where(data => data != null).ToList(); foreach (var binding in memberBindings) { BuildPropertyMap(typeMap.SourceType, typeMap.DestinationType, binding, properties, maps, true); } var descriptor = new ModelDescriptor(typeMap.SourceType, typeMap.DestinationType, new ReadOnlyCollection <PropertyMap>(properties), null, (PropertyDictionary)maps, null, metadata, ModelMapDirection.DataTransferObjectToSource); _modelDescriptorCollection.Add(typeMap.SourceType, descriptor); } if (!reverseMaps.Any()) { return; } foreach (var typeMap in reverseMaps) { var exists = _modelDescriptorCollection.Contains(typeMap.DestinationType); var direction = exists ? ModelMapDirection.Full : ModelMapDirection.SourceToDataTransferObject; var descriptor = exists ? _modelDescriptorCollection[typeMap.DestinationType] : new ModelDescriptor(typeMap.DestinationType, typeMap.SourceType, null, null, null, null, null, direction); var mapExpression = GetMapExpression(typeMap.SourceType, typeMap.DestinationType); var memberBindings = GetMemberBindings(mapExpression); var maps = new Dictionary <string, string>(); var properties = new List <PropertyMap>(); foreach (var binding in memberBindings) { BuildPropertyMap(typeMap.SourceType, typeMap.DestinationType, binding, properties, maps, false); } descriptor.SourceProperties = new ReadOnlyCollection <PropertyMap>(properties); descriptor.SourceMap = (PropertyDictionary)maps; descriptor.SelectExpression = mapExpression; if (!exists) { _modelDescriptorCollection.Add(typeMap.DestinationType, descriptor); } } foreach (var descriptor in _modelDescriptorCollection) { _inspectors.ForEach(inspector => inspector?.Inspect(descriptor)); } }