如何获得Class / BaseClass的私有属性?

时间:2018-05-09 08:22:09

标签: c# reflection

我使用此代码:

BindingFlags flags= BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public;

PropertyInfo prop =  myObj.GetProperty("Age", flags);

prop不为空。但是,当我尝试从myObj获取所有属性时:

foreach(MemberInfo e in myObj.GetType().GetMembers( flags) ) {    //neither GetProperties helps
    Console.WriteLine(e.Name);
}

未列出该属性(Age)。我无法理解这是怎么发生的。

1 个答案:

答案 0 :(得分:1)

Type.GetPropertyType.GetMembers之间的差异是返回私有属性/成员(包括属性),但仅GetMembers返回此类型而不是基类型而{{1}还返回基类型的私有属性。

GetProperty

  

指定GetProperty以包含非公共属性(即   是,私有,内部和受保护的属性)在搜索中。

GetMembers

  

指定BindingFlags.NonPublic以包含非公开成员(即,   搜索中的私有,内部和受保护成员)。只要   返回基类的受保护和内部成员;私人的   不返回基类的成员。

所以我想BindingFlags.NonPublic是一个继承的属性。如果您要添加Age,结果应该相同,您将看不到BindingFlags.DeclaredOnly

如果您想强制Age同时包含私有基类型成员,请使用以下扩展方法循环所有基类型:

GetMembers

现在您的public static class TypeExtensions { public static MemberInfo[] GetMembersInclPrivateBase(this Type t, BindingFlags flags) { var memberList = new List<MemberInfo>(); memberList.AddRange(t.GetMembers(flags)); Type currentType = t; while((currentType = currentType.BaseType) != null) memberList.AddRange(currentType.GetMembers(flags)); return memberList.ToArray(); } } 已经工作,甚至返回了私有的“继承”BindingFlags属性:

Age