public override Expression MapExpression(IConfigurationProvider configurationProvider, ProfileMap profileMap,
                                          IMemberMap memberMap, Expression sourceExpression, Expression destExpression, Expression contextExpression)
 {
     if (destExpression.Type.IsInterface())
     {
         var listType = typeof(IList <>).MakeGenericType(ElementTypeHelper.GetElementType(destExpression.Type));
         destExpression = Expression.Convert(destExpression, listType);
     }
     return(CollectionMapperExpressionFactory.MapCollectionExpression(configurationProvider, profileMap, memberMap, sourceExpression,
                                                                      destExpression, contextExpression, typeof(List <>), CollectionMapperExpressionFactory.MapItemExpr));
 }
        public Expression MapExpression(IConfigurationProvider configurationProvider, ProfileMap profileMap,
                                        IMemberMap memberMap, Expression sourceExpression, Expression destExpression, Expression contextExpression)
        {
            var listType = typeof(List <>).MakeGenericType(ElementTypeHelper.GetElementType(destExpression.Type));
            var list     = CollectionMapperExpressionFactory.MapCollectionExpression(configurationProvider, profileMap, memberMap, sourceExpression, Expression.Default(listType), contextExpression, typeof(List <>), CollectionMapperExpressionFactory.MapItemExpr);
            var dest     = Expression.Variable(listType, "dest");

            var ctor = destExpression.Type.GetDeclaredConstructors()
                       .First(ci => ci.GetParameters().Length == 1 && ci.GetParameters()[0].ParameterType.IsAssignableFrom(dest.Type));

            return(Expression.Block(new[] { dest },
                                    Expression.Assign(dest, list),
                                    Expression.Condition(Expression.NotEqual(dest, Expression.Default(listType)),
                                                         Expression.New(ctor, dest),
                                                         Expression.Default(destExpression.Type))));
        }
Ejemplo n.º 3
0
        public Expression MapExpression(IConfigurationProvider configurationProvider, ProfileMap profileMap,
                                        PropertyMap propertyMap, Expression sourceExpression, Expression destExpression, Expression contextExpression)
        {
            Expression mapExpr = null;

            if (IsDataReader(sourceExpression.Type, destExpression.Type))
            {
                ParameterExpression itemParam;
                Expression          itemExpr;

                try
                {
                    itemExpr = CollectionMapperExpressionFactory.MapItemExpr(configurationProvider, profileMap, typeof(IEnumerable <IDataRecord>), destExpression.Type, contextExpression, out itemParam);
                }
                catch (Exception ex)
                {
                    throw new AutoMapperMappingException("Missing type map configuration or unsupported mapping.", ex, new TypePair(sourceExpression.Type, destExpression.Type));
                }

                if (YieldReturnEnabled)
                {
                    var        mapFunc             = Lambda(itemExpr, itemParam, contextExpression as ParameterExpression);
                    MethodInfo genericMapFunc      = DataReaderHelper.DataReaderAsYieldReturnMethod.MakeGenericMethod(TypeHelper.GetElementType(destExpression.Type));
                    var        sourceAsYieldReturn = Call(null, genericMapFunc, sourceExpression, contextExpression, mapFunc);

                    mapExpr =
                        Block(sourceAsYieldReturn);
                }
                else
                {
                    var sourceAsEnumerable = Call(null, DataReaderHelper.DataReaderAsEnumerableMethod, sourceExpression);
                    var listType           = typeof(List <>).MakeGenericType(TypeHelper.GetElementType(destExpression.Type)); // Cache this if we experience poor performance
                    var listVar            = Variable(listType, "list");
                    var listAddExpr        = Call(listVar, listType.GetMethod("Add"), itemExpr);                              // Cache this if we experience poor performance

                    mapExpr =
                        Block(new[] { listVar },
                              Assign(listVar, New(listType)),
                              ExpressionExtensions.ForEach(sourceAsEnumerable, itemParam, listAddExpr),
                              listVar);
                }
            }

            return(mapExpr);
        }
Ejemplo n.º 4
0
        public override Expression MapExpression(IConfigurationProvider configurationProvider, ProfileMap profileMap,
                                                 IMemberMap memberMap, Expression sourceExpression, Expression destExpression, Expression contextExpression)
        {
            var sourceElementType = ElementTypeHelper.GetElementType(sourceExpression.Type);
            var destElementType   = ElementTypeHelper.GetElementType(destExpression.Type);

            var itemExpr = CollectionMapperExpressionFactory.MapItemExpr(configurationProvider, profileMap, sourceExpression.Type, destExpression.Type, contextExpression, out ParameterExpression itemParam);

            //var count = source.Count();
            //var array = new TDestination[count];

            //int i = 0;
            //foreach (var item in source)
            //    array[i++] = newItemFunc(item, context);
            //return array;

            var countParam = Expression.Parameter(typeof(int), "count");
            var arrayParam = Expression.Parameter(destExpression.Type, "destinationArray");
            var indexParam = Expression.Parameter(typeof(int), "destinationArrayIndex");

            var actions    = new List <Expression>();
            var parameters = new List <ParameterExpression> {
                countParam, arrayParam, indexParam
            };

            var countMethod = typeof(Enumerable)
                              .GetTypeInfo()
                              .DeclaredMethods
                              .Single(mi => mi.Name == "Count" && mi.GetParameters().Length == 1)
                              .MakeGenericMethod(sourceElementType);

            actions.Add(Expression.Assign(countParam, Expression.Call(countMethod, sourceExpression)));
            actions.Add(Expression.Assign(arrayParam, Expression.NewArrayBounds(destElementType, countParam)));
            actions.Add(Expression.Assign(indexParam, Expression.Constant(0)));
            actions.Add(ExpressionFactory.ForEach(sourceExpression, itemParam,
                                                  Expression.Assign(Expression.ArrayAccess(arrayParam, Expression.PostIncrementAssign(indexParam)), itemExpr)
                                                  ));
            actions.Add(arrayParam);

            return(Expression.Block(parameters, actions));
        }
        public Expression MapExpression(IConfigurationProvider configurationProvider, ProfileMap profileMap,
                                        IMemberMap memberMap, Expression sourceExpression, Expression destExpression, Expression contextExpression)
        {
            var dictionaryTypes = ElementTypeHelper.GetElementTypes(destExpression.Type, ElementTypeFlags.BreakKeyValuePair);
            var dictType        = typeof(Dictionary <,>).MakeGenericType(dictionaryTypes);
            var dict            = CollectionMapperExpressionFactory.MapCollectionExpression(configurationProvider, profileMap, memberMap, sourceExpression, Expression.Default(dictType), contextExpression, typeof(Dictionary <,>), CollectionMapperExpressionFactory.MapKeyPairValueExpr);
            var dest            = Expression.Variable(dictType, "dest");

            var readOnlyDictType = destExpression.Type.IsInterface
                ? typeof(ReadOnlyDictionary <,>).MakeGenericType(dictionaryTypes)
                : destExpression.Type;

            var ctor = readOnlyDictType.GetDeclaredConstructors()
                       .First(ci => ci.GetParameters().Length == 1 && ci.GetParameters()[0].ParameterType.IsAssignableFrom(dest.Type));

            return(Expression.Block(new[] { dest },
                                    Expression.Assign(dest, dict),
                                    Expression.Condition(Expression.NotEqual(dest, Expression.Default(dictType)),
                                                         ExpressionFactory.ToType(Expression.New(ctor, dest), destExpression.Type),
                                                         Expression.Default(destExpression.Type))));
        }
Ejemplo n.º 6
0
 public override Expression MapExpression(IConfigurationProvider configurationProvider, ProfileMap profileMap,
                                          IMemberMap memberMap, Expression sourceExpression, Expression destExpression, Expression contextExpression)
 => CollectionMapperExpressionFactory.MapCollectionExpression(configurationProvider, profileMap, memberMap, sourceExpression, destExpression, contextExpression, typeof(List <>), CollectionMapperExpressionFactory.MapItemExpr);
Ejemplo n.º 7
0
 public Expression MapExpression(IConfigurationProvider configurationProvider, ProfileMap profileMap,
                                 IMemberMap memberMap, Expression sourceExpression, Expression destExpression, Expression contextExpression)
 => CollectionMapperExpressionFactory.MapCollectionExpression(configurationProvider, profileMap, memberMap,
                                                              Expression.Call(MembersDictionaryMethodInfo, sourceExpression, Expression.Constant(profileMap)), destExpression, contextExpression, typeof(Dictionary <,>),
                                                              CollectionMapperExpressionFactory.MapKeyPairValueExpr);