我使用此代码:
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
)。我无法理解这是怎么发生的。
答案 0 :(得分:1)
Type.GetProperty
和Type.GetMembers
之间的差异是返回私有属性/成员(包括属性),但仅GetMembers
返回此类型而不是基类型而{{1}还返回基类型的私有属性。
指定
GetProperty
以包含非公共属性(即 是,私有,内部和受保护的属性)在搜索中。
指定
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