2009-08-24 10 views

risposta

20

Questo è come funziona. I membri static sono davvero roba non orientata agli oggetti. Non sono polimorfici e appartengono davvero al loro tipo di dichiarazione e non sono correlati ad altri tipi nella gerarchia dell'ereditarietà. Ad esempio, non è necessario eseguire un inizializzatore statico per una classe base prima di accedere a un membro statico in una classe derivata.

static membri delle classi base non vengono restituiti a meno che non sia specificato BindingFlags.FlattenHierarchy:

type.GetFields(BindingFlags.Static 
      | BindingFlags.FlattenHierarchy 
      | BindingFlags.Public) 
+0

Va notato che questo non troverà * statica privata * su una classe base. Nel caso in cui sia ciò che l'OP sta cercando di fare. – womp

+0

Sì, quello era solo un esempio. Basta aggiungere "BindingFlags.NonPublic' nel caso in cui ne hai bisogno. –

+2

Che ancora non lo farà in realtà. Devi riflettere su campi statici privati ​​direttamente sulla classe base. Anche se spero che OP non stia provando a farlo;) – womp

6

Perché appartengono al tipo di base e non sono ereditati. Sposta fino a quel tipo e li troverai.

- Modifica

Mehrdad ha la risposta giusta, ma solo per completezza:

foreach(FieldInfo f in b.GetType().GetFields(
    BindingFlags.Static 
    | BindingFlags.FlattenHierarchy 
    | BindingFlags.Instance 
    | BindingFlags.Public 
    )){ 
    Console.WriteLine("found: " + f.Name); 
} 
3

tuo tipo è solo il tuo tipo - non include tipi di base. Avrai bisogno di usare BindingFlags.FlattenHierarchy se vuoi cercare campi nelle classi base.

Probabilmente dovresti dare un'occhiata allo BindingFlags documentation per ottenere ciò che ti serve.