Example #1
0
        public Expression MapExpression(IGlobalConfiguration configurationProvider, ProfileMap profileMap, MemberMap memberMap,
                                        Expression sourceExpression, Expression destExpression)
        {
            var sourceType = TypeHelper.GetElementType(sourceExpression.Type);
            var destType   = TypeHelper.GetElementType(destExpression.Type);

            var equivalencyExpression = this.GetEquivalentExpression(sourceType, destType, configurationProvider);

            if (equivalencyExpression == null)
            {
                var typePair = new TypePair(sourceExpression.Type, destExpression.Type);
                return(_objectMapperCache.GetOrAdd(typePair, _ =>
                {
                    var mappers = new List <IObjectMapper>(configurationProvider.GetMappers());
                    for (var i = mappers.IndexOf(this) + 1; i < mappers.Count; i++)
                    {
                        var mapper = mappers[i];
                        if (mapper.IsMatch(typePair))
                        {
                            return mapper;
                        }
                    }
                    return _collectionMapper;
                })
                       .MapExpression(configurationProvider, profileMap, memberMap, sourceExpression, destExpression));
            }

            var method = _mapMethodInfo.MakeGenericMethod(sourceExpression.Type, sourceType, destExpression.Type, destType);
            var map    = Call(null, method, sourceExpression, destExpression, ContextParameter, Constant(equivalencyExpression));

            var notNull = NotEqual(destExpression, Constant(null));
            var collectionMapperExpression = _collectionMapper.MapExpression(configurationProvider, profileMap, memberMap, sourceExpression, destExpression);

            return(Condition(notNull, map, Convert(collectionMapperExpression, destExpression.Type)));
        }