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