2017-01-24 2 views
1

Следующий код не удается найти частные поля, например, если хозяин является Application.Current и член является «_ownDispatcherStarted», он возвращает пустой массив, но если если Я ищу частную собственность, например member является «ParkingHwnd», он возвращает массив длиной 1; он находит это нормально. Почему это?Не удается получить доступ частного поля с Type.GetMember в МОФ

 var hostType = host.GetType(); 
     var members = host.GetType() 
      .GetMember(member, Public | NonPublic | Instance); 

ответ

3

Я просто немного экспериментировал. В соответствии с документацией вам нужно указать BindingFlags.DeclaredOnly, чтобы исключить унаследованные элементы, но в моих тестах я обнаружил, что я не мог получить унаследованные члены, чтобы появляться в возвращаемых значениях от GetMember, GetFields или GetField.

С применением WPF по умолчанию, Application.Current не является экземпляром Application непосредственно, но подкласса Application, определенного в App.xaml. Я обнаружил, что если бы я использовал host.GetType().BaseType, тогда были открыты такие поля, как _ownDispatcherStarted.

Таким образом, для того, чтобы в общем случае найти поля, объявленные базовым классом Application, вам может понадобиться пройти дерево наследования, повторно следуя за BaseType, пока вы не найдете того, кого ищете или не попали в корень.

Это не результат, которого я ожидал, но, надеюсь, он заставит вас идти. :-)

+0

Хороший улов. Я попробовал это и никуда не ушел. Я проходил в флаге «FlattenHierarchy», но, оказывается, вы не получите унаследованных частных полей: «Указывает, что должны быть возвращены общедоступные и защищенные статические члены в иерархии» –

+0

Да, «FlattenHierarchy» для статических членов. В документации подразумевается, что члены экземпляра должны быть включены по умолчанию, и вы можете отказаться от их включения в 'DeclaredOnly', но мое тестирование не показало этого результата. –

+0

Спасибо Джонатану, это дает мне другое измерение, над которым нужно работать. Я вижу, что вы имеете в виду под 'Application.Current', фактическим типом является' MyApplicationNamespace.App' –

Смежные вопросы