Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье приводятся дополнительные замечания к справочной документации по этому API.
Следующее руководство относится ко всем перегрузкам:
- Свойство считается общедоступным для рефлексии, если у него есть хотя бы один общедоступный аксессор. В противном случае свойство считается частным, и его необходимо использовать BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static (в Visual Basic, объединить значения с помощью
Or
) для получения. - Если текущий Type представляет созданный универсальный тип, этот метод возвращает PropertyInfo параметры типа, замененные соответствующими аргументами типа.
- Если текущий Type представляет параметр типа в определении универсального типа или универсального метода, этот метод выполняет поиск свойств ограничения класса.
GetProperty(String)Метод
name
Поиск для name
чувствителен к регистру. Поиск включает свойства общедоступного статического и общедоступного экземпляра.
Ситуации, в которых происходит AmbiguousMatchException, включают следующие:
- Тип содержит два индексированных свойства с одинаковым именем, но разные числа параметров. Чтобы устранить неоднозначность, используйте перегрузку метода GetProperty, которая указывает типы параметров.
- Производный тип объявляет свойство, которое скрывает унаследованное свойство с тем же именем с помощью
new
модификатора (Shadows
в Visual Basic). Чтобы устранить неоднозначность, используйте GetProperty(String, BindingFlags) перегрузку метода и добавьте BindingFlags.DeclaredOnly флаг, чтобы ограничить поиск элементам, которые не наследуются.
GetProperty(String, BindingFlags)Метод
Для определения свойств, которые необходимо включить в поиск, можно использовать следующие BindingFlags флаги фильтра:
- Чтобы получить возврат, необходимо указать либо
BindingFlags.Instance
, либоBindingFlags.Static
. - Укажите
BindingFlags.Public
, чтобы включить общедоступные свойства в поиск. - Укажите
BindingFlags.NonPublic
, чтобы включить недоступные свойства (т. е. частные, внутренние и защищенные свойства) в поиск. - Укажите
BindingFlags.FlattenHierarchy
, чтобы включитьpublic
иprotected
статические элементы в иерархию;private
статические элементы в унаследованных классах не включаются.
Для изменения работы поиска можно использовать следующие BindingFlags флаги модификатора:
-
BindingFlags.IgnoreCase
игнорировать регистрname
. -
BindingFlags.DeclaredOnly
для поиска только объявленных свойств на Type, а не свойств, которые были просто унаследованы.
Ситуации, в которых происходит AmbiguousMatchException, включают следующие:
- Тип содержит два индексированных свойства с одинаковым именем, но разные числа параметров. Чтобы устранить неоднозначность, используйте перегрузку метода GetProperty, которая указывает типы параметров.
- Производный тип объявляет свойство, которое скрывает унаследованное свойство с тем же именем, используя
new
модификатор (Shadows
в Visual Basic). Чтобы устранить неоднозначность, включите BindingFlags.DeclaredOnly, чтобы ограничить поиск элементам, которые не наследуются.
GetProperty(System.String, System.Reflection.BindingFlags, System.Reflection.Binder, System.Type, System.Type[], System.Reflection.ParameterModifier[])
Хотя привязка по умолчанию не выполняет обработку для ParameterModifier (modifiers
параметр), можно использовать абстрактный класс System.Reflection.Binder, чтобы создать пользовательский привязчик, который обрабатывает modifiers
.
ParameterModifier
используется только для вызовов через взаимодействие с COM, и обрабатываются только параметры, передаваемые по ссылке.
В следующей таблице показано, какие элементы базового класса возвращаются Get
методами при отражении типа.
Тип члена | Статика | Нестатическое |
---|---|---|
Конструктор | нет | нет |
Поле | нет | Да. Поле всегда скрывается по имени и подписи. |
Событие | Неприменимо | Правило системы общего типа заключается в том, что наследование следует тем же правилам, что и методы, реализующие свойство. Отражение обрабатывает свойства как скрытие по имени и сигнатуре. 2 |
Метод | нет | Да. Метод (виртуальный и не виртуальный) может быть скрыт по имени или как по имени, так и по подписи. |
Вложенный тип | нет | нет |
Недвижимость | Неприменимо | Правило системы общего типа заключается в том, что наследование следует тем же правилам, что и методы, реализующие свойство. Отражение обрабатывает свойства как скрытие по имени и сигнатуре. 2 |
Примечания:
- Скрытие по имени и сигнатуре учитывает все части подписи, включая настраиваемые модификаторы, возвращаемые типы, типы параметров, sentinels и неуправляемые соглашения о вызовах. Это двоичное сравнение.
- Для отражения свойства и события скрываются по имени и сигнатуре. Если у вас есть свойство с методами get и set в базовом классе, но производный класс имеет только метод get, свойство производного класса перекрывает свойство базового класса, и вы не сможете получить доступ к методу set в базовом классе.
- Пользовательские атрибуты не являются частью общей системы типов.
Для определения свойств, которые необходимо включить в поиск, можно использовать следующие BindingFlags флаги фильтра:
- Чтобы получить возврат, необходимо указать либо
BindingFlags.Instance
, либоBindingFlags.Static
. - Укажите
BindingFlags.Public
, чтобы включить общедоступные свойства в поиск. - Укажите
BindingFlags.NonPublic
, чтобы включить недоступные свойства (т. е. частные, внутренние и защищенные свойства) в поиск. - Укажите
BindingFlags.FlattenHierarchy
, чтобы включитьpublic
иprotected
статические элементы в иерархию;private
статические элементы в унаследованных классах не включаются.
Для изменения работы поиска можно использовать следующие BindingFlags флаги модификатора:
-
BindingFlags.IgnoreCase
игнорировать регистрname
. -
BindingFlags.DeclaredOnly
для поиска только объявленных свойств на Type, а не свойств, которые были просто унаследованы.
Индексаторы и свойства по умолчанию
Visual Basic, C#и C++ имеют упрощенный синтаксис для доступа к индексируемым свойствам и позволяют использовать одно индексированное свойство по умолчанию для его типа. Например, если переменная myList
ссылается на ArrayListсинтаксис myList[3]
(myList(3)
в Visual Basic) извлекает элемент с индексом 3. Свойство можно перегружать.
В C#эта функция называется индексатором и не может ссылаться по имени. По умолчанию индексатор C# отображается в метаданных в виде индексированного свойства с именем Item
. Однако разработчик библиотеки классов может использовать IndexerNameAttribute атрибут для изменения имени индексатора в метаданных. Например, String класс имеет индексатор с именем Chars[]. Индексированные свойства, созданные с помощью языков, отличных от C#, также могут иметь другие имена, нежели Item
.
Чтобы определить, имеет ли тип свойство по умолчанию, используйте GetCustomAttributes(Type, Boolean) метод для проверки атрибута DefaultMemberAttribute . Если тип имеет DefaultMemberAttribute, MemberName свойство возвращает имя свойства по умолчанию.