2009-03-10 16 views

Antwort

60

Ja.

Type type = typeof(TheClass); 
FieldInfo info = type.GetField(name, BindingFlags.NonPublic | BindingFlags.Static); 
object value = info.GetValue(null); 

Dies ist für ein Feld. Ändern Sie für eine Eigenschaft type.GetField in type.GetProperty. Sie können auf ähnliche Weise auch auf private Methoden zugreifen.

+1

Es ist vielleicht erwähnenswert, dass das statische Feld auch über 'info.SetValue (null, value)' zugewiesen werden kann. Ich habe diese Antwort verwendet, um einen Wert für ein statisches Feld festzulegen. – IAbstract

-1

versuchen, etwas wie folgt aus:

Type type = typeof(MyClass); 
MemberInfo[] members = type.GetMembers(BindingFlags.NonPublic | BindingFlags.Static); 

ich denken würde, ist funktionieren sollte.

+0

MemberInfo hat keine 'GetValue (...)' oder 'SetValue (...)' Methoden. Mitglieder sind häufiger tatsächliche Methoden/Funktionen. – IAbstract

1

Wenn Sie volles Vertrauen haben, sollten Sie in der Lage zu tun:

Type t = typeof(TheClass); 
FieldInfo field = t.GetField("myFieldName", BindingFlags.NonPublic | BindingFlags.Static); 
object fieldValue = field.GetValue(myObject); 

Wenn Sie jedoch diese auf einem System ohne volles Vertrauen ausführen, wird der GetField Aufruf fehlschlagen, und das wird nicht funktionieren.

5

Ich nehme an, jemand sollte fragen, ob das eine gute Idee ist oder nicht? Es erstellt eine Abhängigkeit von der privaten Implementierung dieser statischen Klasse. Die private Implementierung unterliegt Änderungen, ohne dass Benutzer, die Reflection für den Zugriff auf die private Implementierung verwenden, benachrichtigt werden.

Wenn die beiden Klassen zusammenarbeiten sollen, sollten Sie das Feld intern erstellen und die Assembly der kooperierenden Klasse in ein [assembly: InternalsVisibleTo] -Attribut hinzufügen.

+1

In Produktionscode ist dies in der Regel eine schlechte Idee. Es kann jedoch sehr nützlich sein, wenn Sie Komponententests durchführen, da Sie Tests schreiben können, ohne Felder freilegen zu müssen, die Sie lieber privat halten möchten. – AVee

+3

@AVeee: für Unit-Tests, machen Sie das Feld "internal" und verwenden Sie "InternalsVisibleTo". Besser, Komponententests sollten die Implementierung nicht testen, sondern nur das Verhalten korrigieren. In Abhängigkeit vom privaten Feld bricht nun der Komponententest ab, wenn sich die Klassenimplementierung ändert. –

+1

Ich stimme @JohnSaunders Reflexion wie diese ist sehr spröde. Es gibt jedoch Fälle, in denen es als vorübergehende Umgehung existieren sollte - d. H. Der Produktionscode ist bereits freigegeben, aber ich brauchte ein spezielles Dienstprogramm, um einige Akzeptanztests durchzuführen. Dies konnte ich nur erreichen, indem ich über Reflektion auf ein privates statisches Feld zugreife. Dieser Code wird geändert und die reflektierte Klasse wird geändert, um die Interaktion zu ermöglichen, die das neue Dienstprogramm in der nächsten Version benötigt. – IAbstract

Verwandte Themen