Как получить приватные свойства Class / BaseClass? - PullRequest
0 голосов
/ 09 мая 2018

Я использую этот код:

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 голосов
/ 09 мая 2018

Разница между 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...