diff --git a/ExpressMapper NET40/MappingServiceBase.cs b/ExpressMapper NET40/MappingServiceBase.cs index a469458..c09a190 100644 --- a/ExpressMapper NET40/MappingServiceBase.cs +++ b/ExpressMapper NET40/MappingServiceBase.cs @@ -121,40 +121,34 @@ public Expression GetMemberMappingExpression(Expression left, Expression right, var destType = destNullableType ?? left.Type; var sourceType = sourceNullableType ?? right.Type; - if (ComplexMapCondition(sourceType, destType)) + var customMapExpression = GetCustomMapExpression(right.Type, left.Type); + if (customMapExpression != null) { - var customMapExpression = GetCustomMapExpression(right.Type, left.Type); - if (customMapExpression != null) - { - var srcExp = Expression.Variable(right.Type, - string.Format("{0}Src", Guid.NewGuid().ToString("N"))); - var assignSrcExp = Expression.Assign(srcExp, right); + var srcExp = Expression.Variable(right.Type, + string.Format("{0}Src", Guid.NewGuid().ToString("N"))); + var assignSrcExp = Expression.Assign(srcExp, right); - var destExp = Expression.Variable(left.Type, - string.Format("{0}Dst", Guid.NewGuid().ToString("N"))); - var assignDestExp = Expression.Assign(destExp, left); + var destExp = Expression.Variable(left.Type, + string.Format("{0}Dst", Guid.NewGuid().ToString("N"))); + var assignDestExp = Expression.Assign(destExp, left); - // try precise substitute visitor - var substituteParameterVisitor = - new PreciseSubstituteParameterVisitor( - new KeyValuePair( - Expression.Variable(right.Type, "srcTyped"), srcExp), - new KeyValuePair( - Expression.Variable(left.Type, "dstTyped"), destExp)); + // try precise substitute visitor + var substituteParameterVisitor = + new PreciseSubstituteParameterVisitor( + new KeyValuePair( + Expression.Variable(right.Type, "srcTyped"), srcExp), + new KeyValuePair( + Expression.Variable(left.Type, "dstTyped"), destExp)); - var blockExpression = substituteParameterVisitor.Visit(customMapExpression) as BlockExpression; + var blockExpression = substituteParameterVisitor.Visit(customMapExpression) as BlockExpression; - var assignResultExp = Expression.Assign(left, destExp); - var resultBlockExp = Expression.Block(new[] { srcExp, destExp }, assignSrcExp, assignDestExp, blockExpression, assignResultExp); + var assignResultExp = Expression.Assign(left, destExp); - var checkNullExp = - Expression.IfThenElse(Expression.Equal(right, Expression.Default(right.Type)), - Expression.Assign(left, Expression.Default(left.Type)), resultBlockExp); - - var releaseExp = Expression.Block(new ParameterExpression[] { }, (right.Type.GetInfo().IsPrimitive || right.Type.GetInfo().IsValueType ? resultBlockExp : (Expression)checkNullExp)); + return Expression.Block(new[] { srcExp, destExp }, assignSrcExp, assignDestExp, blockExpression, assignResultExp); + } - return releaseExp; - } + if (ComplexMapCondition(sourceType, destType)) + { var returnTypeDifferenceVisitor = new ReturnTypeDifferenceVisitor(right); returnTypeDifferenceVisitor.Visit(right); @@ -196,7 +190,9 @@ public Expression GetMemberMappingExpression(Expression left, Expression right, destNullableType, sourceNullableType); - var conditionalExpression = nullCheckNestedMemberVisitor.CheckNullExpression != null ? Expression.Condition(nullCheckNestedMemberVisitor.CheckNullExpression, Expression.Assign(left, Expression.Default(left.Type)), binaryExpression) : (Expression)binaryExpression; + var conditionalExpression = nullCheckNestedMemberVisitor.CheckNullExpression != null ? + Expression.Condition(nullCheckNestedMemberVisitor.CheckNullExpression, + Expression.Assign(left, Expression.Default(left.Type)), binaryExpression) : binaryExpression; return conditionalExpression; } @@ -446,7 +442,8 @@ internal static Expression ConvertCollection(Type destPropType, else { ctor = destPropType.GetInfo().GetConstructors(BindingFlags.Public | BindingFlags.Instance).FirstOrDefault( - ci => { + ci => + { var param = ci.GetParameters(); return param.Length == 1 && param[0].ParameterType.GetInfo().IsAssignableFrom(destList); }); diff --git a/ExpressMapper.Tests NET40/BasicTests.cs b/ExpressMapper.Tests NET40/BasicTests.cs index 4931d8f..bca558d 100644 --- a/ExpressMapper.Tests NET40/BasicTests.cs +++ b/ExpressMapper.Tests NET40/BasicTests.cs @@ -53,6 +53,16 @@ public void ParallelPrecompileCollectionTest() Parallel.Invoke(actions.ToArray()); } + [Test] + public void RegisterCustomStringToStringTest() + { + Mapper.Register(); + Mapper.RegisterCustom(src => src ?? ""); + var tst = new TestDefaultDecimalToStringViewModel(); + var result = Mapper.Map(tst); + Assert.AreEqual(result.TestString, ""); + } + [Test] public void DefaultPrimitiveTypePropertyToStringTest() { @@ -74,9 +84,9 @@ public void MemberMappingsHasHigherPriorityThanCaseSensetiveTest() .Member(t => t.Enabled, s => s.enabled == "Y"); Mapper.Compile(); - var source = new Source { enabled = "N" }; - var result = Mapper.Map(source); - Assert.AreEqual(result.Enabled, false); + var source = new Source { enabled = "N" }; + var result = Mapper.Map(source); + Assert.AreEqual(result.Enabled, false); } [Test] @@ -293,7 +303,7 @@ public void HiddenInheritedMemberMap() Assert.AreEqual(result, srcDst.Value); } - private void MapBaseMember(IMemberConfiguration mapConfig) + private void MapBaseMember(IMemberConfiguration mapConfig) where T : Gift where TN : GiftViewModel { @@ -948,7 +958,7 @@ public void ExistingSrcCollGreater() Assert.AreEqual(result.Collection.ElementAt(i), testResult.Item3.Collection.ElementAt(i)); } } - + [Test] public void ExistingDestDestCollGreater() { @@ -1201,7 +1211,7 @@ public void MemberCaseSensitivityGlobalMapTest() }; var typoCaseViewModel = Mapper.Map(typoCase); - + Assert.AreEqual(typoCaseViewModel.Id, Guid.Empty); Assert.AreEqual(typoCaseViewModel.Name, null); Assert.AreEqual(typoCase.TestId, typoCaseViewModel.TestId);