2011-05-05 27 views
59

Esto es lo que he hecho hasta ahora:Obtener el valor de un campo estático público a través de la reflexión

var props = typeof (Settings.Lookup).GetFields(); 
Console.WriteLine(props[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"; 
    } 
} 
+8

Solo tenga en cuenta que llamar a la variable 'props' en lugar de' fields' puede confundir a un futuro desarrollador. Las propiedades son sus propias cosas, y los campos definitivamente no son ellos. – ErikE

Respuesta

108

Tiene que pasar a nullGetValue , ya que este campo no pertenece a ninguna instancia:

props[0].GetValue(null) 
+2

no hay sobrecarga tomando solo un parámetro? http://msdn.microsoft.com/en-us/library/system.reflection.propertyinfo.getvalue.aspx –

+3

@Pauli: a pesar del nombre de la variable, esto es un FieldInfo, no un Propertyinfo –

+0

, está tan absolutamente right –

4

La firma de FieldInfo.GetValue es

public abstract Object GetValue(
    Object obj 
) 

donde obj es la instancia del objeto que desea recuperar el valor de null o si se trata de una clase estática. Por lo que este debe hacer:

var props = typeof (Settings.Lookup).GetFields(); 
Console.WriteLine(props[0].GetValue(null, null)); 
+0

No confíes en los nombres de las variables ... el OP está llamando a GetFields, no a GetProperties;) –

+0

ha, tienes toda la razón ... actualizó mi respuesta –

2

probar este

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

Es necesario utilizar Type.GetField (System.Reflection.BindingFlags) Sobrecarga:

Por ejemplo:

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

Settings.Lookup lookup = (Settings.Lookup)field.GetValue(null); 
Cuestiones relacionadas