2009-08-24 8 views

Antwort

20

Dies ist, wie es funktioniert. static Mitglieder sind wirklich nicht objektorientierte Sachen. Sie sind nicht polymorph und gehören wirklich zu ihrem Deklarationstyp und haben keinen Bezug zu anderen Typen in der Vererbungshierarchie. Ein statischer Initializer für eine Basisklasse muss beispielsweise nicht ausgeführt werden, bevor auf ein statisches Member in einer abgeleiteten Klasse zugegriffen wird.

static Mitglieder der Basisklassen zurückgegeben werden, nicht, es sei denn BindingFlags.FlattenHierarchy angegeben:

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

Es sollte angemerkt werden, dass dies immer noch nicht finden * private * Statik auf einer Basisklasse. Nur für den Fall, dass OP das versucht. – womp

+0

Ja, das war nur ein Beispiel. Fügen Sie 'BindingFlags.NonPublic' hinzu, falls Sie es brauchen. –

+2

Das wird es immer noch nicht tun. Sie müssen über private statische Felder direkt in der Basisklasse nachdenken. Obwohl ich hoffe, OP versucht das nicht;) – womp

6

Weil sie zum Basistyp gehören und nicht vererbt werden. Gehe zu diesem Typ und du wirst sie finden.

- Bearbeiten

Mehrdad hat die richtige Antwort, sondern nur der Vollständigkeit halber:

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

Ihre Art ist Ihre Art einfach - es Basistypen nicht enthalten. Sie müssen BindingFlags.FlattenHierarchy verwenden, wenn Sie Felder in Basisklassen durchsuchen möchten.

Sie sollten sich wahrscheinlich die BindingFlags documentation ansehen, um zu erreichen, was Sie brauchen.

Verwandte Themen