@@ -535,7 +535,8 @@ internal enum MemberKind
535535 Public = 1 ,
536536 Internal = 2 ,
537537 ExplicitlyImplemented = 4 ,
538- DefaultInterfaceProperties = 8
538+ DefaultInterfaceProperties = 8 ,
539+ Static = 16
539540}
540541
541542internal static class MemberKindExtensions
@@ -564,37 +565,38 @@ public static BindingFlags ToBindingFlags(this MemberKind kind)
564565internal sealed class Reflector
565566{
566567 private readonly HashSet < string > collectedPropertyNames = new ( ) ;
567- private readonly HashSet < string > collectedFields = new ( ) ;
568- private readonly List < FieldInfo > fields = new ( ) ;
569- private List < PropertyInfo > properties = new ( ) ;
568+ private readonly HashSet < string > collectedFieldNames = new ( ) ;
569+ private readonly List < FieldInfo > selectedFields = new ( ) ;
570+ private List < PropertyInfo > selectedProperties = new ( ) ;
570571
571572 public Reflector ( Type typeToReflect , MemberKind kind )
572573 {
573574 LoadProperties ( typeToReflect , kind ) ;
574575 LoadFields ( typeToReflect , kind ) ;
575576
576- Members = properties . Concat < MemberInfo > ( fields ) . ToArray ( ) ;
577+ Members = selectedProperties . Concat < MemberInfo > ( selectedFields ) . ToArray ( ) ;
577578 }
578579
579580 private void LoadProperties ( Type typeToReflect , MemberKind kind )
580581 {
581582 while ( typeToReflect != null && typeToReflect != typeof ( object ) )
582583 {
583- var allProperties = typeToReflect . GetProperties (
584- BindingFlags . Instance | BindingFlags . Static | BindingFlags . DeclaredOnly | BindingFlags . Public |
585- BindingFlags . NonPublic ) ;
584+ BindingFlags flags = BindingFlags . DeclaredOnly | BindingFlags . Public | BindingFlags . NonPublic ;
585+ flags |= kind . HasFlag ( MemberKind . Static ) ? BindingFlags . Static : BindingFlags . Instance ;
586+
587+ var allProperties = typeToReflect . GetProperties ( flags ) ;
586588
587589 AddNormalProperties ( kind , allProperties ) ;
588590
589591 AddExplicitlyImplementedProperties ( kind , allProperties ) ;
590592
591- AddInterfaceProperties ( typeToReflect , kind ) ;
593+ AddInterfaceProperties ( typeToReflect , kind , flags ) ;
592594
593595 // Move to the base type
594596 typeToReflect = typeToReflect . BaseType ;
595597 }
596598
597- properties = properties . Where ( x => ! x . IsIndexer ( ) ) . ToList ( ) ;
599+ selectedProperties = selectedProperties . Where ( x => ! x . IsIndexer ( ) ) . ToList ( ) ;
598600 }
599601
600602 private void AddNormalProperties ( MemberKind kind , PropertyInfo [ ] allProperties )
@@ -607,7 +609,7 @@ private void AddNormalProperties(MemberKind kind, PropertyInfo[] allProperties)
607609 if ( ! collectedPropertyNames . Contains ( property . Name ) && ! property . IsExplicitlyImplemented ( ) &&
608610 HasVisibility ( kind , property ) )
609611 {
610- properties . Add ( property ) ;
612+ selectedProperties . Add ( property ) ;
611613 collectedPropertyNames . Add ( property . Name ) ;
612614 }
613615 }
@@ -633,29 +635,28 @@ private void AddExplicitlyImplementedProperties(MemberKind kind, PropertyInfo[]
633635
634636 if ( ! collectedPropertyNames . Contains ( name ) )
635637 {
636- properties . Add ( p ) ;
638+ selectedProperties . Add ( p ) ;
637639 collectedPropertyNames . Add ( name ) ;
638640 }
639641 }
640642 }
641643 }
642644 }
643645
644- private void AddInterfaceProperties ( Type typeToReflect , MemberKind kind )
646+ private void AddInterfaceProperties ( Type typeToReflect , MemberKind kind , BindingFlags flags )
645647 {
646648 if ( kind . HasFlag ( MemberKind . DefaultInterfaceProperties ) || typeToReflect . IsInterface )
647649 {
648- // Add explicitly implemented interface properties (not included above)
649650 var interfaces = typeToReflect . GetInterfaces ( ) ;
650651
651652 foreach ( var iface in interfaces )
652653 {
653- foreach ( var prop in iface . GetProperties ( ) )
654+ foreach ( var prop in iface . GetProperties ( flags ) )
654655 {
655656 if ( ! collectedPropertyNames . Contains ( prop . Name ) &&
656657 ( ! prop . GetMethod . IsAbstract || typeToReflect . IsInterface ) )
657658 {
658- properties . Add ( prop ) ;
659+ selectedProperties . Add ( prop ) ;
659660 collectedPropertyNames . Add ( prop . Name ) ;
660661 }
661662 }
@@ -667,15 +668,17 @@ private void LoadFields(Type typeToReflect, MemberKind kind)
667668 {
668669 while ( typeToReflect != null && typeToReflect != typeof ( object ) )
669670 {
670- var files = typeToReflect . GetFields (
671- BindingFlags . Instance | BindingFlags . DeclaredOnly | BindingFlags . Public | BindingFlags . NonPublic ) ;
671+ BindingFlags flags = BindingFlags . DeclaredOnly | BindingFlags . Public | BindingFlags . NonPublic ;
672+ flags |= kind . HasFlag ( MemberKind . Static ) ? BindingFlags . Static : BindingFlags . Instance ;
673+
674+ var files = typeToReflect . GetFields ( flags ) ;
672675
673676 foreach ( var field in files )
674677 {
675- if ( ! collectedFields . Contains ( field . Name ) && HasVisibility ( kind , field ) )
678+ if ( ! collectedFieldNames . Contains ( field . Name ) && HasVisibility ( kind , field ) )
676679 {
677- fields . Add ( field ) ;
678- collectedFields . Add ( field . Name ) ;
680+ selectedFields . Add ( field ) ;
681+ collectedFieldNames . Add ( field . Name ) ;
679682 }
680683 }
681684
@@ -692,7 +695,7 @@ private static bool HasVisibility(MemberKind kind, FieldInfo field)
692695
693696 public MemberInfo [ ] Members { get ; }
694697
695- public PropertyInfo [ ] Properties => properties . ToArray ( ) ;
698+ public PropertyInfo [ ] Properties => selectedProperties . ToArray ( ) ;
696699
697- public FieldInfo [ ] Fields => fields . ToArray ( ) ;
700+ public FieldInfo [ ] Fields => selectedFields . ToArray ( ) ;
698701}
0 commit comments