Erhalten Sie den Wert eines öffentlichen statischen Feldes durch Reflexion

85

Folgendes habe ich bisher getan:

 var fields = typeof (Settings.Lookup).GetFields();
 Console.WriteLine(fields[0].GetValue(Settings.Lookup)); 
         // Compile error, Class Name is not valid at this point

Und das ist meine statische Klasse:

public static class Settings
{
   public static class Lookup
   {
      public static string F1 ="abc";
   }
}
Omu
quelle
10
Nur ein Hinweis, dass das Aufrufen der Variablen propsanstelle von fieldseinen zukünftigen Entwickler verwirren kann. Eigenschaften sind ihre eigenen Dinge, und Felder sind es definitiv nicht.
ErikE

Antworten:

160

Sie müssen sich übergeben nullzu GetValue, da dieses Feld auf jeden Fall nicht , gehören tut:

props[0].GetValue(null)
Thomas Levesque
quelle
2
Gibt es keine Überlastung mit nur einem Parameter? msdn.microsoft.com/en-us/library/…
Pauli Østerø
4
@Pauli: Trotz des Namens der Variablen ist dies eine FieldInfo, keine Propertyinfo
Thomas Levesque
17

Sie müssen die Überladung Type.GetField (System.Reflection.BindingFlags) verwenden:

Beispielsweise:

FieldInfo field = typeof(Settings.Lookup).GetField("Lookup", BindingFlags.Public | BindingFlags.Static);

Settings.Lookup lookup = (Settings.Lookup)field.GetValue(null);
Matías Fidemraizer
quelle
7

Die Unterschrift von FieldInfo.GetValueist

public abstract Object GetValue(
    Object obj
)

Wo objist die Objektinstanz, von der Sie den Wert abrufen möchten, oder nullob es sich um eine statische Klasse handelt? Das sollte also reichen:

var props = typeof (Settings.Lookup).GetFields();
Console.WriteLine(props[0].GetValue(null)); 
Pauli Østerø
quelle
1
Traue keinen Variablennamen ... das OP ruft GetFields auf, nicht GetProperties;)
Thomas Levesque
@ PauliØsterø was entspricht der zweite null? FieldInfo.GetValueAkzeptiert nicht nur einen einzelnen Parameter? Ich kann keine Überladungen von GetValueoder irgendetwas finden
Thomas Flinkow
@ThomasFlinkow nur Tippfehler, es ist jetzt behoben
Pauli Østerø
@ PauliØsterø dachte schon :) wollte nur sicherstellen, dass der Code in der Frage fertig zum Kopieren und Einfügen ist. Also +1 für eine gute Antwort.
Thomas Flinkow
4

Versuche dies

FieldInfo fieldInfo = typeof(Settings.Lookup).GetFields(BindingFlags.Static | BindingFlags.Public)[0];
    object value = fieldInfo.GetValue(null); // value = "abc"
Aliostad
quelle