在C#中使用反射

本文关键字:反射 | 更新日期: 2023-09-27 18:24:52

根据这个答案,我正在尝试复制它并迭代我的CustomerModel属性。

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; }

也许绑定标志不正确?我对反射的使用是新手。

在C#中使用反射

这些是属性,而不是字段。使用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; } }
}
正如Joe正确指出的,有问题的成员是属性而不是字段。这些是自动实现的属性,编译器将为它们生成支持字段。然而,这些字段不会是公共的,因此GetFields调用失败,因为它只查找公共成员。如果您想查看生成的字段,请将代码更改为以下
FieldInfo[] fields = customer.GetFields(BindingFlags.NonPublic | BindingFlags.Instance);