Использование GetProperties() с BindingFlags.DeclaredOnly в .NET Reflection
Если я использую
sometype.GetProperties();
Я получаю все свойства от типа и его родителя. Однако я хочу только получить свойства, определенные явно в этом типе (а не для родителей). Я думал, что это был вариант BindingFlags.DeclaredOnly
.
Однако, когда я пытаюсь это сделать:
sometype.GetProperties(BindingFlags.DeclaredOnly);
Я получаю 0 свойств.
Кто-нибудь знает, что я делаю неправильно?
Ответы
Ответ 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())
{
// ...
}