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