如何使用C#反射获取实例化的属性或不为null的类类型的属性

时间:2019-06-11 03:10:04

标签: c# .net reflection .net-core system.reflection

我是反射的新手,我想知道如何过滤私有属性,并且还仅获取实例化的属性。我要实现的目标示例如下。

public class PersonalDetails
{
    internal Address AddressDetails { get; set; }
    public Contact ContactDetals { get; set; }
    public List<PersonalDetails> Friends { get; set; }
    public string FirstName { get; set; }
    private int TempValue { get; set; }
    private int Id { get; set; }

    public PersonalDetails()
    {
        Id = 1;
        TempValue = 5;
    }
}

public class Address
{
    public string MailingAddress { get; set; }
    public string ResidentialAddress { get; set; }
}

public class Contact
{
    public string CellNumber { get; set; }
    public string OfficePhoneNumber { get; set; }
}

PersonalDetails pd = new PersonalDetails();
pd.FirstName = "First Name";
pd.ContactDetals = new Contact();
pd.ContactDetals.CellNumber = "666 666 666";

当我获得对象 pd 的属性时,我想过滤掉私有的且未实例化的属性,例如属性 TempValue Id AddressDetails

谢谢。

1 个答案:

答案 0 :(得分:1)

也许是

var p = new PersonalDetails();

var properties = p.GetType()
                  .GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
                  .Where(x => x.GetValue(p) != null && !x.GetMethod.IsPrivate && !x.SetMethod.IsPrivate)
                  .ToList();

其他资源

BindingFlags Enum

  

指定用于控制绑定和搜索方式的标志   对于成员和类型,是通过反思进行的。

PropertyInfo.GetValue Method

  

返回指定对象的属性值。