Skip to content

Commit

Permalink
added caching for PropertyInfos in AutomaticMapper
Browse files Browse the repository at this point in the history
  • Loading branch information
joeyb committed Apr 7, 2014
1 parent 5131985 commit 81b2833
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 8 deletions.
21 changes: 21 additions & 0 deletions src/Moll.Test/AutomaticMapperTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -128,5 +128,26 @@ public void MapToDestWithPropertyWithDifferentTypeUsingCustomMapper()
Assert.AreEqual(src.Prop1.ToString(CultureInfo.InvariantCulture), dest.Prop1);
Assert.AreEqual(src.Prop2, dest.Prop2);
}

[Test]
public void MapMultipleSrcsWithSameMapper()
{
var mapper = new AutomaticMapper<TestSrcClass1, TestDestClass1>();

var src1 = new TestSrcClass1 {Prop1 = 1, Prop2 = "Test"};
var src2 = new TestSrcClass1 {Prop1 = 2, Prop2 = "Test"};

var dest1 = mapper.Map(src1);
var dest2 = mapper.Map(src2);

Assert.IsNotNull(dest1);
Assert.IsNotNull(dest2);

Assert.AreEqual(src1.Prop1, dest1.Prop1);
Assert.AreEqual(src2.Prop1, dest2.Prop1);

Assert.AreEqual(src1.Prop2, dest1.Prop2);
Assert.AreEqual(src2.Prop2, dest2.Prop2);
}
}
}
22 changes: 14 additions & 8 deletions src/Moll/AutomaticMapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,28 @@ public class AutomaticMapper<TSrc, TDest> : IMapper<TSrc, TDest>
where TSrc : class
where TDest : class, new()
{
public TDest Map(TSrc src)
{
if (src == null) return null;
private readonly PropertyInfo[] _srcPropertyInfos;
private readonly PropertyInfo[] _destPropertyInfos;

var srcProps = typeof (TSrc)
public AutomaticMapper()
{
_srcPropertyInfos = typeof (TSrc)
.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.GetProperty);

var destProps = typeof (TDest)
_destPropertyInfos = typeof (TDest)
.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.SetProperty);
}

public TDest Map(TSrc src)
{
if (src == null) return null;

var dest = new TDest();

foreach (var srcProp in srcProps)
foreach (var srcProp in _srcPropertyInfos)
{
var destProp =
destProps.FirstOrDefault(x => x.Name == srcProp.Name && x.PropertyType == srcProp.PropertyType);
var destProp = _destPropertyInfos
.FirstOrDefault(x => x.Name == srcProp.Name && x.PropertyType == srcProp.PropertyType);

if (destProp == null) continue;

Expand Down

0 comments on commit 81b2833

Please sign in to comment.