Использование GetProperties () с BindingFlags.DeclaredOnly в .NET Reflection - PullRequest
56 голосов
/ 09 октября 2009

Если я использую

sometype.GetProperties();

Я получаю все свойства от типа и его родителя. Однако я только хочу получить свойства, определенные явно в этом типе (не родители). Я думал, что это то, для чего была опция BindingFlags.DeclaredOnly.

Однако, когда я пытаюсь это сделать:

sometype.GetProperties(BindingFlags.DeclaredOnly);

Я получаю 0 объектов недвижимости.

Кто-нибудь знает, что я делаю не так?

Ответы [ 5 ]

79 голосов
/ 09 октября 2009

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

sometype.GetProperties (BindingFlags.DeclaredOnly | 
                        BindingFlags.Public | 
                        BindingFlags.Instance);
44 голосов
/ 09 октября 2009

Подведем итог:

  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 flags могут использоваться для изменения порядка поиска:

  • BindingFlags.DeclaredOnly для поиска только свойств, объявленных в типе, а не свойств, которые были просто унаследованы.
15 голосов
/ 09 октября 2009

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

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

var flags = BindingFlags.DeclaredOnly 
  | BindingFlags.Instance
  | BindingFlags.Public;
someType.GetProperties(flags);
0 голосов
/ 28 мая 2014

У меня были проблемы с использованием typeof(Thing), в итоге у меня это сработало:

        var thisThing = (new Thing()).GetType();
        foreach (var property in thisThing.GetProperties())
        {
            // ...
        }
0 голосов
/ 31 июля 2013

С сайта MSDN .

По умолчанию (элемент) Указывает отсутствие флага привязки.

Вы должны указать Instance или Static вместе с Public или NonPublic или участники не будут возвращены.

Следовательно, если вы не укажете флаги привязки, вы ничего не получите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...