Поделиться через


Методы System.Type.GetProperty

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