2013-07-25 112 views
0

正在關注this回答時,我試圖複製它並遍歷我的CustomerModel屬性。在C#中使用反射

CustomerModel pippo = new CustomerModel(); 
Type customer = pippo.GetType(); 
FieldInfo[] fields = customer.GetFields(BindingFlags.Public | BindingFlags.Instance); 

在使用調試器,fields總是有count = 0但CustomerModel有很多公共屬性我想在田裏看到的。我怎樣才能做到這一點?以下是我希望看到的一些屬性的摘錄。

[DataMember] 
    public String Id { get; set; } 

    [DataMember] 
    public String LoginName { get; set; } 

    [DataMember] 
    public String Password { get; set; } 

    [DataMember] 
    public String CreationDate { get; set; } 

也許綁定標誌是不正確的?我是使用反射的新手。

+0

我建議將變量名稱從'customer'更改爲'customerType'或類似的東西。 'customer'聽起來更像是'CustomerModel'的一個實例,而不是它的類型。 –

+0

是的,我甚至不會再存儲這個變量,只是得到屬性......這只是爲了測試的目的。 – Saturnix

回答

6

這些屬性,而不是字段。使用GetProperties而不是GetFields

在C#:

public class Foo { 

    // this is a field: 
    private string _name; 

    // this is a property: 
    public string Name { get; set; } 

    // this is also a property: 
    public string SomethingElse { get { return _name; } set { _name = value; } } 

} 
+0

它正在工作!非常感謝,並原諒這個愚蠢的問題,但這是我第一次使用反射...再次感謝! :) – Saturnix

+0

沒問題。隨着越來越多的反思,你會發現你可以用它做很多很酷的事情(還有很多危險的東西:)) –

2

喬正確地指出問題的成員是性能不字段。這些是自動實現的屬性,編譯器將爲它們生成後備字段。但是這些字段不會公開,因此GetFields呼叫失敗,因爲它只查找公共成員。如果你想看到生成的字段,然後將代碼更改爲以下內容

FieldInfo[] fields = customer.GetFields(BindingFlags.NonPublic | BindingFlags.Instance); 
+0

+1我現在對檢索私人領域不感興趣,但是這是我剛剛學到的新東西 - 感謝發佈! – Saturnix