2011-05-05 62 views
59

公共静态字段的值,这是我迄今所做的:获得通过反射

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

这是我的静态类:

public static class Settings 
{ 
    public static class Lookup 
    { 
     public static string F1 ="abc"; 
    } 
} 
+8

只需注意调用变量'props'而不是'fields'就可能会混淆未来的开发人员。属性是他们自己的东西,而字段绝对不是它们。 – ErikE 2015-07-21 22:26:09

回答

108

你需要传递nullGetValue ,因为此字段不属于任何实例:

props[0].GetValue(null) 
+2

没有超载只有一个参数? http://msdn.microsoft.com/en-us/library/system.reflection.propertyinfo.getvalue.aspx – 2011-05-05 13:27:55

+3

@Pauli:尽管变量的名称,这是一个FieldInfo,而不是一个Propertyinfo – 2011-05-05 13:30:30

+0

你是如此绝对right – 2011-05-05 13:34:13

4

的签名是

public abstract Object GetValue(
    Object obj 
) 

其中obj是要检索的价值或null如果它是一个静态的类的对象实例。因此,这应该这样做:

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

不要相信变量名... OP正在调用GetFields,而不是GetProperties;) – 2011-05-05 13:31:17

+0

ha,你完全正确......更新了我的答案 – 2011-05-05 13:32:29

2

试试这个

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

您需要使用Type.GetField(System.Reflection.BindingFlags)过载:

例如:

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

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