2014-02-19 64 views
0

我想循環遍歷類中的每個屬性,輸出屬性的名稱和值。但我的代碼沒有返回任何屬性。Type.GetProperties不返回任何屬性

類繞環通過:通過他們全部用來循環

public class GameOptions 
{ 
    public ushort Fps; 
    public ushort Height; 
    public ushort Width; 
    public bool FreezeOnFocusLost; 
    public bool ShowCursor; 
    public bool StaysOnTop; 
    public bool EscClose; 
    public string Title; 
    public bool Debug; 
    public int DebugInterval = 500; 
} 

代碼:

foreach (PropertyInfo property in this.Options.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)) 
{ 
    debugItems.Add("Setting Name: " + property.Name); 
    debugItems.Add("Setting Value: " + property.GetValue(this,null)); 
} 

但是當我改變public ushort Fps;public ushort Fps { get; set; }它會找到它。

回答

4
public ushort Fps; 
public ushort Height; 
... 

它們不是屬性而是字段。改爲嘗試GetFields。或者,可能更好,將它們轉換爲屬性。例如。

public ushort Fps {get; set;} 
public ushort Height {get; set;} 
+0

怎麼就認定他們當我添加{get;組; } 然後?還有另一種方式來循環他們所有? – user1763295

+1

@ user1763295你讓他們屬性:)。 – AlexD

+0

謝謝,它工作!我會盡可能接受你的答案。 – user1763295

2

你的類只包含字段,所以GetProperties返回空數組。

使用GetFields()代替

foreach (FieldInfo field in this.Options.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)) 
{ 
    debugItems.Add("Setting Name: " + field.Name); 
    debugItems.Add("Setting Value: " + field.GetValue(this)); 
} 

更改字段屬性

public class GameOptions 
{ 
    public ushort Fps { get; set; } 
    public ushort Height { get; set; } 
    public ushort Width { get; set; } 
    // (...) 
} 
+1

請注意'FieldInfo'沒有帶有兩個參數的'GetValue'方法。 – Virtlink

2

的原因,它會發現public ushort Fps { get; set; }但不public ushort Fps;是因爲後者是一個領域,而不是財產。

對於字段,你將不得不使用Type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)

Type.GetFields

1

GameOptions不包含property.They的所有領域。

當你這樣做:

public ushort Fps { get; set; } 

要定義auto-implemented屬性,這意味着支持字段由scenes.Anyway背後編譯器創建,當你想使用的字段:

this.Options.GetType().GetFields(); 
1
public class GameOptions 
{ 
    public ushort Fps; 
    public ushort Height; 
    //... 
} 

那些是你在那裏的領域。


要麼使用GetFields method,它返回的FieldInfo objects數組:

Type type = this.Options.GetType(); 
var fields = type.GetFields(
    BindingFlags.Instance | 
    BindingFlags.Public | 
    BindingFlags.NonPublic); 

foreach (var field in fields) 
{ 
    debugItems.Add("Setting Name: " + field.Name); 
    debugItems.Add("Setting Value: " + field.GetValue(this)); 
} 

或者使字段成(auto-implemented)性質:

public class GameOptions 
{ 
    public ushort Fps { get; set; } 
    public ushort Height { get; set; } 
    //... 
}