Ejemplo n.º 1
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.º 2
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));
        }