Obtenga valor de un campo estático público a través de la reflexión

85

Esto es lo que he hecho hasta ahora:

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

Y esta es mi clase estática:

public static class Settings
{
   public static class Lookup
   {
      public static string F1 ="abc";
   }
}
Omu
fuente
10
Solo una nota de que llamar a la variable en propslugar de fieldspuede confundir a un futuro desarrollador. Las propiedades son sus propias cosas y los campos definitivamente no lo son.
ErikE

Respuestas:

161

Necesita pasar nulla GetValue, ya que este campo no pertenece a ninguna instancia:

props[0].GetValue(null)
Thomas Levesque
fuente
2
no hay sobrecarga tomando solo un parámetro? msdn.microsoft.com/en-us/library/…
Pauli Østerø
4
@Pauli: a pesar del nombre de la variable, este es un FieldInfo, no un Propertyinfo
Thomas Levesque
18

Necesita usar la sobrecarga Type.GetField (System.Reflection.BindingFlags):

Por ejemplo:

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

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

La firma de FieldInfo.GetValuees

public abstract Object GetValue(
    Object obj
)

donde objes la instancia de objeto de la que desea recuperar el valor o nullsi es una clase estática. Entonces esto debería hacer:

var props = typeof (Settings.Lookup).GetFields();
Console.WriteLine(props[0].GetValue(null)); 
Pauli Østerø
fuente
1
No confíe en los nombres de variables ... el OP está llamando a GetFields, no a GetProperties;)
Thomas Levesque
@ PauliØsterø ¿a qué nullcorresponde el segundo ? ¿No FieldInfo.GetValueacepta solo un único parámetro? Parece que no puedo encontrar sobrecargas GetValueni nada
Thomas Flinkow
@ThomasFlinkow mero error tipográfico, está arreglado ahora
Pauli Østerø
@ PauliØsterø pensó que sí :) solo quería asegurarse de que el código de la pregunta esté listo para copiar y pegar. Entonces +1 para una buena respuesta.
Thomas Flinkow
4

Prueba esto

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