Использование GetProperties () с BindingFlags. DeclaredOnly в отражении.NET

Объяснение от одного из шаблонных гуру:

, Если Вы хотите разделить свои шаблонные источники на интерфейс и реализацию (существует много серьезных оснований сделать это, включая управление инстанцированием), Вы не можете очень хорошо использовать то же имя (foo.hpp) дважды, и foo.cpp не подходил бы ни для одного. foo.ipp ясно формирует рисунок файла, поскольку файл реализации намеревался быть #included в foo.hpp.

57
задан SteveC 12 November 2013 в 11:29
поделиться

3 ответа

Если вы укажете какие-либо BindingFlags , тогда вам нужно будет явно указать, какие свойства вы хотите получить. Например:

sometype.GetProperties (BindingFlags.DeclaredOnly | 
                        BindingFlags.Public | 
                        BindingFlags.Instance);
82
ответ дан 24 November 2019 в 19:24
поделиться

Вам нужно немного расширить свой BindingsFlag. Они должны по крайней мере указать, какой уровень доступности и экземпляр по сравнению со статическим, чтобы получить что-либо значимое обратно.

Я думаю, что вы действительно ищете следующее

var flags = BindingFlags.DeclaredOnly 
  | BindingFlags.Instance
  | BindingFlags.Public;
someType.GetProperties(flags);
15
ответ дан 24 November 2019 в 19:24
поделиться

Подводя итог:

  1. если вы используете перегрузку GetProperties () (без параметров), вы получите все общедоступные свойства .

  2. , с другой стороны, если вы используете перегрузку GetProperties (BindingFlags) (та, которая принимает параметр BindingFlags ), то вам необходимо указать побитовое ИЛИ не менее по одному из каждой группы следующих флагов:

    • BindingFlags.Instance / BindingFlags.Static (экземпляр против статических свойств),
    • BindingFlags.Public / BindingFlags. NonPublic (общедоступные и закрытые свойства).

Например, чтобы получить общедоступные статические свойства, вам нужно будет вызвать GetProperties (BindingFlags.Public | BindingFlags.Static) , чтобы получить результаты. Вызов только GetProperties (BindingFlags.Public) или GetProperties (BindingFlags.Static) не вернет никаких результатов.

Обратите внимание, что указание BindingFlags.Default вернет пустой массив .

Полную информацию можно найти в документации MSDN для GetProperties (BindingFlags) :

Следующие флаги BindingFlags filter могут использоваться для определения вложенных типов, которые следует включить в поиск:

  • Вы должны указать либо BindingFlags.Instance , либо BindingFlags .Static , чтобы получить результат.
  • Укажите BindingFlags.Public , чтобы включить общедоступные свойства в поиск.
  • Укажите BindingFlags.NonPublic , чтобы включить не- общедоступные методы (то есть частные, внутренние и защищенные методы) в поиске. Возвращаются только защищенные и внутренние методы базовых классов; частные методы базовых классов не возвращаются.
  • Укажите BindingFlags.FlattenHierarchy , чтобы включить общедоступные и защищенные статические элементы вверх по иерархии; закрытые статические члены в унаследованных классах не включаются.

Следующие флаги модификатора BindingFlags могут использоваться для изменения способа работы поиска:

  • BindingFlags.DeclaredOnly для поиска только свойств, объявленных в Тип, а не свойства, которые были просто унаследованы.
47
ответ дан 24 November 2019 в 19:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: