2011-05-05 99 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);