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