Skip to content

Commit 0e27928

Browse files
committed
Fix Mapping Hidden Base member
1 parent 2986140 commit 0e27928

File tree

2 files changed

+29
-8
lines changed

2 files changed

+29
-8
lines changed

src/Mapster.Tests/WhenMappingInitProperty.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public void WhenMappingToHiddenandNewInitFieldDestination()
1919
var c = source.Adapt<BDestination>();
2020
var s = source.Adapt(new BDestination());
2121

22-
((ADestination)c).Id.ShouldBe(156);
22+
((ADestination)c).Id.ShouldBe(default); // Hidden Base member is not mapping
2323
s.Id.ShouldBe(156);
2424
}
2525

@@ -33,7 +33,7 @@ public void WhenMappingToHiddenandNewInitFieldWithConstructUsing()
3333
var c = source.Adapt<BDestination>();
3434
var s = source.Adapt(new BDestination());
3535

36-
((ADestination)c).Id.ShouldBe(256);
36+
((ADestination)c).Id.ShouldBe(default); // Hidden Base member is not mapping
3737
s.Id.ShouldBe(256);
3838
}
3939

src/Mapster/Utils/ReflectionUtils.cs

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -75,23 +75,44 @@ public static IEnumerable<IMemberModelEx> GetFieldsAndProperties(this Type type,
7575
var bindingFlags = BindingFlags.Instance | BindingFlags.Public;
7676
if (includeNonPublic)
7777
bindingFlags |= BindingFlags.NonPublic;
78-
78+
79+
var currentTypeMembers = type.FindMembers(MemberTypes.Property | MemberTypes.Field,
80+
BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic,
81+
(x, y) => true, type.FullName);
82+
7983
if (type.GetTypeInfo().IsInterface)
8084
{
8185
var allInterfaces = GetAllInterfaces(type);
82-
return allInterfaces.SelectMany(GetPropertiesFunc);
86+
return allInterfaces.SelectMany(x => GetPropertiesFunc(x, currentTypeMembers));
8387
}
8488

85-
return GetPropertiesFunc(type).Concat(GetFieldsFunc(type));
89+
return GetPropertiesFunc(type, currentTypeMembers).Concat(GetFieldsFunc(type, currentTypeMembers));
8690

87-
IEnumerable<IMemberModelEx> GetPropertiesFunc(Type t) => t.GetProperties(bindingFlags)
88-
.Where(x => x.GetIndexParameters().Length == 0)
91+
IEnumerable<IMemberModelEx> GetPropertiesFunc(Type t, MemberInfo[] currentTypeMembers) => t.GetProperties(bindingFlags)
92+
.Where(x => x.GetIndexParameters().Length == 0).DropHiddenMembers(currentTypeMembers)
8993
.Select(CreateModel);
9094

91-
IEnumerable<IMemberModelEx> GetFieldsFunc(Type t) => t.GetFields(bindingFlags)
95+
IEnumerable<IMemberModelEx> GetFieldsFunc(Type t, MemberInfo[] overlapMembers) =>
96+
t.GetFields(bindingFlags).DropHiddenMembers(overlapMembers)
9297
.Select(CreateModel);
9398
}
9499

100+
public static IEnumerable<T> DropHiddenMembers<T>(this IEnumerable<T> allMembers, ICollection<MemberInfo> currentTypeMembers) where T : MemberInfo
101+
{
102+
var compareMemberNames = allMembers.IntersectBy(currentTypeMembers.Select(x => x.Name), x => x.Name).Select(x => x.Name);
103+
104+
foreach (var member in allMembers)
105+
{
106+
if (compareMemberNames.Contains(member.Name))
107+
{
108+
if (currentTypeMembers.First(x => x.Name == member.Name).MetadataToken == member.MetadataToken)
109+
yield return member;
110+
}
111+
else
112+
yield return member;
113+
}
114+
}
115+
95116
// GetProperties(), GetFields(), GetMethods() do not return properties/methods from parent interfaces,
96117
// so we need to process every one of them separately.
97118
public static IEnumerable<Type> GetAllInterfaces(this Type interfaceType)

0 commit comments

Comments
 (0)