Skip to content

Commit 605941b

Browse files
authored
Merge pull request #2438 from lbargaoanu/ObservableCollection
We don't need the property map when mapping the item; for nested coll…
2 parents 096e58a + 7f7abb3 commit 605941b

File tree

3 files changed

+43
-9
lines changed

3 files changed

+43
-9
lines changed

src/AutoMapper/Mappers/ArrayMapper.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public override Expression MapExpression(IConfigurationProvider configurationPro
2121
var sourceElementType = ElementTypeHelper.GetElementType(sourceExpression.Type);
2222
var destElementType = ElementTypeHelper.GetElementType(destExpression.Type);
2323

24-
var itemExpr = MapItemExpr(configurationProvider, profileMap, propertyMap, sourceExpression.Type, destExpression.Type, contextExpression, out ParameterExpression itemParam);
24+
var itemExpr = MapItemExpr(configurationProvider, profileMap, sourceExpression.Type, destExpression.Type, contextExpression, out ParameterExpression itemParam);
2525

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

src/AutoMapper/Mappers/Internal/CollectionMapperExpressionFactory.cs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ namespace AutoMapper.Mappers.Internal
1515
public static class CollectionMapperExpressionFactory
1616
{
1717
public delegate Expression MapItem(IConfigurationProvider configurationProvider, ProfileMap profileMap,
18-
PropertyMap propertyMap, Type sourceType, Type destType, Expression contextParam,
18+
Type sourceType, Type destType, Expression contextParam,
1919
out ParameterExpression itemParam);
2020

2121
public static Expression MapCollectionExpression(IConfigurationProvider configurationProvider, ProfileMap profileMap, PropertyMap propertyMap, Expression sourceExpression, Expression destExpression, Expression contextExpression, Type ifInterfaceType, MapItem mapItem)
@@ -24,7 +24,7 @@ public static Expression MapCollectionExpression(IConfigurationProvider configur
2424
var newExpression = Variable(passedDestination.Type, "collectionDestination");
2525
var sourceElementType = ElementTypeHelper.GetElementType(sourceExpression.Type);
2626

27-
var itemExpr = mapItem(configurationProvider, profileMap, propertyMap, sourceExpression.Type, passedDestination.Type,
27+
var itemExpr = mapItem(configurationProvider, profileMap, sourceExpression.Type, passedDestination.Type,
2828
contextExpression, out ParameterExpression itemParam);
2929

3030
var destinationElementType = itemExpr.Type;
@@ -86,20 +86,19 @@ private static Expression NewExpr(this Type baseType, Type ifInterfaceType)
8686
return newExpr;
8787
}
8888

89-
public static Expression MapItemExpr(IConfigurationProvider configurationProvider, ProfileMap profileMap, PropertyMap propertyMap, Type sourceType, Type destType, Expression contextParam, out ParameterExpression itemParam)
89+
public static Expression MapItemExpr(IConfigurationProvider configurationProvider, ProfileMap profileMap, Type sourceType, Type destType, Expression contextParam, out ParameterExpression itemParam)
9090
{
9191
var sourceElementType = ElementTypeHelper.GetElementType(sourceType);
9292
var destElementType = ElementTypeHelper.GetElementType(destType);
9393
itemParam = Parameter(sourceElementType, "item");
9494

9595
var typePair = new TypePair(sourceElementType, destElementType);
9696

97-
var itemExpr = MapExpression(configurationProvider, profileMap, typePair, itemParam, contextParam,
98-
propertyMap);
97+
var itemExpr = MapExpression(configurationProvider, profileMap, typePair, itemParam, contextParam);
9998
return ToType(itemExpr, destElementType);
10099
}
101100

102-
public static Expression MapKeyPairValueExpr(IConfigurationProvider configurationProvider, ProfileMap profileMap, PropertyMap propertyMap, Type sourceType, Type destType, Expression contextParam, out ParameterExpression itemParam)
101+
public static Expression MapKeyPairValueExpr(IConfigurationProvider configurationProvider, ProfileMap profileMap, Type sourceType, Type destType, Expression contextParam, out ParameterExpression itemParam)
103102
{
104103
var sourceElementTypes = ElementTypeHelper.GetElementTypes(sourceType, ElementTypeFlags.BreakKeyValuePair);
105104
var destElementTypes = ElementTypeHelper.GetElementTypes(destType, ElementTypeFlags.BreakKeyValuePair);
@@ -112,9 +111,9 @@ public static Expression MapKeyPairValueExpr(IConfigurationProvider configuratio
112111
var destElementType = typeof(KeyValuePair<,>).MakeGenericType(destElementTypes);
113112

114113
var keyExpr = MapExpression(configurationProvider, profileMap, typePairKey,
115-
Property(itemParam, "Key"), contextParam, propertyMap);
114+
Property(itemParam, "Key"), contextParam);
116115
var valueExpr = MapExpression(configurationProvider, profileMap, typePairValue,
117-
Property(itemParam, "Value"), contextParam, propertyMap);
116+
Property(itemParam, "Value"), contextParam);
118117
var keyPair = New(destElementType.GetDeclaredConstructors().First(), keyExpr, valueExpr);
119118
return keyPair;
120119
}

src/UnitTests/CollectionMapping.cs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,41 @@
99

1010
namespace AutoMapper.UnitTests
1111
{
12+
public class When_mapping_to_existing_observable_collection : AutoMapperSpecBase
13+
{
14+
class CollectionHolder
15+
{
16+
public CollectionHolder()
17+
{
18+
Observable = new ObservableCollection<List<int>>();
19+
}
20+
21+
public ObservableCollection<List<int>> Observable { get; set; }
22+
}
23+
24+
class CollectionHolderDto
25+
{
26+
public CollectionHolderDto()
27+
{
28+
Observable = new List<List<int>>();
29+
}
30+
31+
public List<List<int>> Observable { get; set; }
32+
}
33+
34+
protected override MapperConfiguration Configuration => new MapperConfiguration(cfg => cfg.CreateMap<CollectionHolderDto, CollectionHolder>().ForMember(a => a.Observable, opt => opt.UseDestinationValue()));
35+
36+
[Fact]
37+
public void Should_map_ok()
38+
{
39+
var ch = new CollectionHolderDto();
40+
var list = new List<int>{ 5, 6 };
41+
ch.Observable.Add(list);
42+
var mapped = Mapper.Map<CollectionHolder>(ch);
43+
mapped.Observable.Single().ShouldBe(list);
44+
}
45+
}
46+
1247
public class When_mapping_to_existing_collection_typed_as_IEnumerable : AutoMapperSpecBase
1348
{
1449
protected override MapperConfiguration Configuration => new MapperConfiguration(_=>{ });

0 commit comments

Comments
 (0)