Разница между Type.GetProperty
и Type.GetMembers
заключается в том, что оба возвращают частные свойства / члены (которые включают в себя свойства), но GetMembers
только этого типа, а не из базовых типов, тогда как GetProperty
также возвращает частные свойства базы типы.
GetProperty
:
Укажите BindingFlags.NonPublic
, чтобы включить непубличные свойства (которые
частные, внутренние и защищенные свойства) в поиске.
GetMembers
:
Укажите 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
свойство возвращается:
MemberInfo[] allMembers = myObj.GetType().GetMembersInclPrivateBase(flags);