@@ -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