Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Замечание
В этой статье приводятся дополнительные замечания к справочной документации по этому 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 свойство возвращает имя свойства по умолчанию.