private List <MappingProperty> GetMappingProperties(MappingTypeAssociation typeAssociation) { PropertyInfo[] sourceProperties = typeAssociation.Source.GetProperties(); PropertyInfo[] destinationProperties = typeAssociation.Destination.GetProperties(); List <MappingProperty> mappingProperties = new List <MappingProperty>(); foreach (PropertyInfo sourceProperty in sourceProperties) { foreach (PropertyInfo destinationProperty in destinationProperties) { if (sourceProperty.Name.Equals(destinationProperty.Name) && TypesAssignInfo.CanAssign(sourceProperty.PropertyType, destinationProperty.PropertyType)) { mappingProperties.Add(new MappingProperty(sourceProperty, destinationProperty)); } } } return(mappingProperties); }
public TDestination Map <TSource, TDestination>(TSource source) where TDestination : new() { if (source == null) { throw new ArgumentNullException(); } Func <TSource, TDestination> func; MappingTypeAssociation typeAssociation = new MappingTypeAssociation(typeof(TDestination), typeof(TSource)); if (_cache.Contains(typeAssociation)) { func = _cache.Get <TSource, TDestination>(typeAssociation); } else { func = _builder.Build <TSource, TDestination>(GetMappingProperties(typeAssociation)); _cache.Put(typeAssociation, func); } return(func.Invoke(source)); }
public bool Contains(MappingTypeAssociation typeAssociation) => _cache.ContainsKey(typeAssociation);
public void Put <TSource, TDestination>(MappingTypeAssociation typeAssociation, Func <TSource, TDestination> mappingFunction) { _cache.Add(typeAssociation, mappingFunction); }
public Func <TSource, TDestination> Get <TSource, TDestination>(MappingTypeAssociation typeAssociation) => (Func <TSource, TDestination>)_cache[typeAssociation];