Skip to content

Commit 72c2488

Browse files
committed
Fix Mapping Hidden Base member
1 parent 155a723 commit 72c2488

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
@@ -69,23 +69,44 @@ public static IEnumerable<IMemberModelEx> GetFieldsAndProperties(this Type type,
6969
var bindingFlags = BindingFlags.Instance | BindingFlags.Public;
7070
if (includeNonPublic)
7171
bindingFlags |= BindingFlags.NonPublic;
72-
72+
73+
var currentTypeMembers = type.FindMembers(MemberTypes.Property | MemberTypes.Field,
74+
BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic,
75+
(x, y) => true, type.FullName);
76+
7377
if (type.GetTypeInfo().IsInterface)
7478
{
7579
var allInterfaces = GetAllInterfaces(type);
76-
return allInterfaces.SelectMany(GetPropertiesFunc);
80+
return allInterfaces.SelectMany(x => GetPropertiesFunc(x, currentTypeMembers));
7781
}
7882

79-
return GetPropertiesFunc(type).Concat(GetFieldsFunc(type));
83+
return GetPropertiesFunc(type, currentTypeMembers).Concat(GetFieldsFunc(type, currentTypeMembers));
8084

81-
IEnumerable<IMemberModelEx> GetPropertiesFunc(Type t) => t.GetProperties(bindingFlags)
82-
.Where(x => x.GetIndexParameters().Length == 0)
85+
IEnumerable<IMemberModelEx> GetPropertiesFunc(Type t, MemberInfo[] currentTypeMembers) => t.GetProperties(bindingFlags)
86+
.Where(x => x.GetIndexParameters().Length == 0).DropHiddenMembers(currentTypeMembers)
8387
.Select(CreateModel);
8488

85-
IEnumerable<IMemberModelEx> GetFieldsFunc(Type t) => t.GetFields(bindingFlags)
89+
IEnumerable<IMemberModelEx> GetFieldsFunc(Type t, MemberInfo[] overlapMembers) =>
90+
t.GetFields(bindingFlags).DropHiddenMembers(overlapMembers)
8691
.Select(CreateModel);
8792
}
8893

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

0 commit comments

Comments
 (0)