From 202c7d412905f955de8f705d28e210c9690d0278 Mon Sep 17 00:00:00 2001 From: Nicolas Takashi Date: Tue, 8 Aug 2017 15:17:31 -0300 Subject: [PATCH 1/4] Fix to Map Value Objects Based on the code snippet that @g-adolph put on issue #46 discussion thread. Now we can map properties of value objects. --- .../Utils/ReflectionHelper.cs | 21 +++++++++++++++---- .../Dapper.FluentMap.Tests.csproj | 3 +++ .../ManualMappingTests.cs | 18 ++++++++++++++++ test/Dapper.FluentMap.Tests/TestEntity.cs | 10 +++++++++ 4 files changed, 48 insertions(+), 4 deletions(-) diff --git a/src/Dapper.FluentMap/Utils/ReflectionHelper.cs b/src/Dapper.FluentMap/Utils/ReflectionHelper.cs index 832fd0e..cf7f061 100644 --- a/src/Dapper.FluentMap/Utils/ReflectionHelper.cs +++ b/src/Dapper.FluentMap/Utils/ReflectionHelper.cs @@ -1,4 +1,6 @@ -using System.Linq.Expressions; +using System; +using System.Linq; +using System.Linq.Expressions; using System.Reflection; namespace Dapper.FluentMap.Utils @@ -31,11 +33,22 @@ public static MemberInfo GetMemberInfo(LambdaExpression lambda) case ExpressionType.MemberAccess: var memberExpression = (MemberExpression)expr; var baseMember = memberExpression.Member; + Type paramType; + + while (!(memberExpression is null)) + { + paramType = memberExpression.Type; + if (paramType.GetMembers().Any(member => member.Name == baseMember.Name)) + { + return paramType.GetMember(baseMember.Name).FirstOrDefault(); + } + + memberExpression = memberExpression.Expression as MemberExpression; + } // Make sure we get the property from the derived type. - var paramType = lambda.Parameters[0].Type; - var memberInfo = paramType.GetMember(baseMember.Name)[0]; - return memberInfo; + paramType = lambda.Parameters.FirstOrDefault().Type; + return paramType.GetMember(baseMember.Name).FirstOrDefault(); default: return null; diff --git a/test/Dapper.FluentMap.Tests/Dapper.FluentMap.Tests.csproj b/test/Dapper.FluentMap.Tests/Dapper.FluentMap.Tests.csproj index 9211f44..50afc70 100644 --- a/test/Dapper.FluentMap.Tests/Dapper.FluentMap.Tests.csproj +++ b/test/Dapper.FluentMap.Tests/Dapper.FluentMap.Tests.csproj @@ -11,4 +11,7 @@ + + + \ No newline at end of file diff --git a/test/Dapper.FluentMap.Tests/ManualMappingTests.cs b/test/Dapper.FluentMap.Tests/ManualMappingTests.cs index b533207..5f82d7b 100644 --- a/test/Dapper.FluentMap.Tests/ManualMappingTests.cs +++ b/test/Dapper.FluentMap.Tests/ManualMappingTests.cs @@ -138,6 +138,16 @@ public void PropertyMapShouldMapInheritedProperies() Assert.Equal(typeof(DerivedTestEntity), nameMap.PropertyInfo.DeclaringType); } + [Fact] + public void PropertyMapShouldMapValueObjectProperties() + { + PreTest(); + + var map = new ValueObjectMap(); + var email = map.PropertyMaps.First(); + Assert.Equal(typeof(EmailTestValueObject), email.PropertyInfo.DeclaringType); + } + private static void PreTest() { FluentMapper.EntityMaps.Clear(); @@ -189,5 +199,13 @@ public MapWithDuplicateMapping() private class EmptyMap : EntityMap { } + + private class ValueObjectMap : EntityMap + { + public ValueObjectMap() + { + Map(x => x.Email.Address).ToColumn("email"); + } + } } } diff --git a/test/Dapper.FluentMap.Tests/TestEntity.cs b/test/Dapper.FluentMap.Tests/TestEntity.cs index 44bfd8c..2826780 100644 --- a/test/Dapper.FluentMap.Tests/TestEntity.cs +++ b/test/Dapper.FluentMap.Tests/TestEntity.cs @@ -9,4 +9,14 @@ public class DerivedTestEntity : TestEntity { public string Name { get; set; } } + + public class ValueObjectTestEntity + { + public EmailTestValueObject Email { get; set; } + } + + public class EmailTestValueObject + { + public string Address { get; set; } + } } From 94741f87a36f818443e4e093f30d218b02abe7cd Mon Sep 17 00:00:00 2001 From: Nicolas Takashi Date: Wed, 9 Aug 2017 11:44:56 -0300 Subject: [PATCH 2/4] Applying Suggestions to Maintain Code Pattern --- src/Dapper.FluentMap/Utils/ReflectionHelper.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Dapper.FluentMap/Utils/ReflectionHelper.cs b/src/Dapper.FluentMap/Utils/ReflectionHelper.cs index cf7f061..031023c 100644 --- a/src/Dapper.FluentMap/Utils/ReflectionHelper.cs +++ b/src/Dapper.FluentMap/Utils/ReflectionHelper.cs @@ -35,12 +35,12 @@ public static MemberInfo GetMemberInfo(LambdaExpression lambda) var baseMember = memberExpression.Member; Type paramType; - while (!(memberExpression is null)) + while (memberExpression != null) { paramType = memberExpression.Type; if (paramType.GetMembers().Any(member => member.Name == baseMember.Name)) { - return paramType.GetMember(baseMember.Name).FirstOrDefault(); + return paramType.GetMember(baseMember.Name)[0]; } memberExpression = memberExpression.Expression as MemberExpression; @@ -48,7 +48,7 @@ public static MemberInfo GetMemberInfo(LambdaExpression lambda) // Make sure we get the property from the derived type. paramType = lambda.Parameters.FirstOrDefault().Type; - return paramType.GetMember(baseMember.Name).FirstOrDefault(); + return paramType.GetMember(baseMember.Name)[0]; default: return null; From 75151aef253a3d7fe4e54bb20864e9eef3602a91 Mon Sep 17 00:00:00 2001 From: Nicolas Takashi Date: Wed, 9 Aug 2017 13:58:44 -0300 Subject: [PATCH 3/4] Remove FirstOrDefault Remove FirstOrDefault to keep code pattern --- src/Dapper.FluentMap/Utils/ReflectionHelper.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Dapper.FluentMap/Utils/ReflectionHelper.cs b/src/Dapper.FluentMap/Utils/ReflectionHelper.cs index 031023c..1e723e4 100644 --- a/src/Dapper.FluentMap/Utils/ReflectionHelper.cs +++ b/src/Dapper.FluentMap/Utils/ReflectionHelper.cs @@ -47,7 +47,7 @@ public static MemberInfo GetMemberInfo(LambdaExpression lambda) } // Make sure we get the property from the derived type. - paramType = lambda.Parameters.FirstOrDefault().Type; + paramType = lambda.Parameters.[0].Type; return paramType.GetMember(baseMember.Name)[0]; default: From 93adaa9e9882acada50fda74637ed35960dfac5b Mon Sep 17 00:00:00 2001 From: Nicolas Takashi Date: Wed, 9 Aug 2017 14:09:07 -0300 Subject: [PATCH 4/4] Fix code syntax. --- src/Dapper.FluentMap/Utils/ReflectionHelper.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Dapper.FluentMap/Utils/ReflectionHelper.cs b/src/Dapper.FluentMap/Utils/ReflectionHelper.cs index 1e723e4..d507e9d 100644 --- a/src/Dapper.FluentMap/Utils/ReflectionHelper.cs +++ b/src/Dapper.FluentMap/Utils/ReflectionHelper.cs @@ -47,7 +47,7 @@ public static MemberInfo GetMemberInfo(LambdaExpression lambda) } // Make sure we get the property from the derived type. - paramType = lambda.Parameters.[0].Type; + paramType = lambda.Parameters[0].Type; return paramType.GetMember(baseMember.Name)[0]; default: