Подтвердить что ты не робот

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

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

sometype.GetProperties();

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

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

sometype.GetProperties(BindingFlags.DeclaredOnly);

Я получаю 0 свойств.

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

4b9b3361

Ответ 1

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

sometype.GetProperties (BindingFlags.DeclaredOnly | 
                        BindingFlags.Public | 
                        BindingFlags.Instance);

Ответ 2

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

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

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

    • BindingFlags.Instance/BindingFlags.Static (экземпляр против статических свойств),
    • BindingFlags.Public/BindingFlags.NonPublic (public vs non-public properties).

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

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

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

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

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

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

  • BindingFlags.DeclaredOnly, чтобы искать только свойства, объявленные в типе, а не свойства, которые были просто унаследованы.

Ответ 3

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

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

var flags = BindingFlags.DeclaredOnly 
  | BindingFlags.Instance
  | BindingFlags.Public;
someType.GetProperties(flags);

Ответ 4

С сайта MSDN.

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

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

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

Ответ 5

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

        var thisThing = (new Thing()).GetType();
        foreach (var property in thisThing.GetProperties())
        {
            // ...
        }