예제 #1
0
        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);
        }
예제 #2
0
        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));
        }
예제 #3
0
 public bool Contains(MappingTypeAssociation typeAssociation) => _cache.ContainsKey(typeAssociation);
예제 #4
0
 public void Put <TSource, TDestination>(MappingTypeAssociation typeAssociation,
                                         Func <TSource, TDestination> mappingFunction)
 {
     _cache.Add(typeAssociation, mappingFunction);
 }
예제 #5
0
 public Func <TSource, TDestination> Get <TSource, TDestination>(MappingTypeAssociation typeAssociation) => (Func <TSource, TDestination>)_cache[typeAssociation];