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


Методы System.Type.GetProperty

В этой статье приводятся дополнительные замечания к справочной документации по этому API.

GetProperty(String)Метод

name Поиск учитывает регистр. Поиск включает свойства общедоступного статического и общедоступного экземпляра.

Свойство считается общедоступным для отражения, если он имеет по крайней мере один общедоступный метод доступа. В противном случае свойство считается частным, и его необходимо использовать BindingFlags.NonPublic | | BindingFlags.InstanceBindingFlags.Static (в Visual Basic, объединить значения с помощью Or) для получения.

Если текущий Type представляет созданный универсальный тип, этот метод возвращает PropertyInfo параметры типа, замененные соответствующими аргументами типа.

Если текущий Type представляет параметр типа в определении универсального типа или универсального метода, этот метод выполняет поиск свойств ограничения класса.

Ситуации, в которых AmbiguousMatchException происходят следующие ситуации:

  • Тип содержит два индексированных свойства с одинаковым именем, но разные числа параметров. Чтобы устранить неоднозначность, используйте перегрузку GetProperty метода, указывающего типы параметров.
  • Производный тип объявляет свойство, которое скрывает унаследованное свойство с тем же именем с помощью new модификатора (Shadows в Visual Basic). Чтобы устранить неоднозначность, используйте GetProperty(String, BindingFlags) перегрузку метода и добавьте BindingFlags.DeclaredOnly флаг, чтобы ограничить поиск элементам, которые не наследуются.

GetProperty(String, BindingFlags)Метод

Свойство считается общедоступным для отражения, если он имеет по крайней мере один общедоступный метод доступа. В противном случае свойство считается частным, и его необходимо использовать BindingFlags.NonPublic | | BindingFlags.InstanceBindingFlags.Static (в Visual Basic, объединить значения с помощью Or) для получения.

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

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

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

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

Дополнительные сведения см. в разделе System.Reflection.BindingFlags.

Если текущий Type представляет созданный универсальный тип, этот метод возвращает PropertyInfo параметры типа, замененные соответствующими аргументами типа.

Если текущий Type представляет параметр типа в определении универсального типа или универсального метода, этот метод выполняет поиск свойств ограничения класса.

Ситуации, в которых AmbiguousMatchException происходят следующие ситуации:

  • Тип содержит два индексированных свойства с одинаковым именем, но разные числа параметров. Чтобы устранить неоднозначность, используйте перегрузку GetProperty метода, указывающего типы параметров.
  • Производный тип объявляет свойство, которое скрывает унаследованное свойство с тем же именем, используя new модификатор (Shadows в Visual Basic). Чтобы устранить неоднозначность, включите BindingFlags.DeclaredOnly ограничение поиска элементам, которые не наследуются.

GetProperty(System.String,System.РефлексияИонный. BindingFlags,System. Рефлексия ion. Binder,System.Type,System.Type[], System. Рефлексия ion. ParameterModifier[])

Свойство считается общедоступным для отражения, если он имеет по крайней мере один общедоступный метод доступа. В противном случае свойство считается частным, и его необходимо использовать BindingFlags.NonPublic | | BindingFlags.InstanceBindingFlags.Static (в Visual Basic, объединить значения с помощью Or) для получения.

Хотя привязка по умолчанию не обрабатывает ParameterModifier ( modifiers параметр), можно использовать абстрактный System.Reflection.Binder класс для записи пользовательского привязчика, выполняющего процесс modifiers. ParameterModifier используется только при вызове COM-взаимодействия, а обрабатываются только параметры, передаваемые по ссылке.

В следующей таблице показано, какие элементы базового класса возвращаются Get методами при отражении типа.

Тип члена Статические Нестатическое
Конструктор No No
Поле No Да. Поле всегда скрывается по имени и подписи.
Событие Нет данных Правило системы общего типа заключается в том, что наследование совпадает с методами, реализующими свойство. Рефлексия ion обрабатывает свойства как скрытие по имени и сигнатуре.2
Способ No Да. Метод (как виртуальный, так и не виртуальный) может быть скрыт по имени или скрытию по имени и сигнатуре.
Вложенный тип No No
Свойство Нет данных Правило системы общего типа заключается в том, что наследование совпадает с методами, реализующими свойство. Рефлексия ion обрабатывает свойства как скрытие по имени и сигнатуре.2

Примечания.

  1. Скрытие по имени и сигнатуре учитывает все части подписи, включая настраиваемые модификаторы, возвращаемые типы, типы параметров, sentinels и неуправляемые соглашения о вызовах. Это двоичное сравнение.
  2. Для отражения свойства и события скрываются по имени и сигнатуре. Если у вас есть свойство с методом get и набором доступа в базовом классе, но производный класс имеет только метод доступа, производное свойство класса скрывает свойство базового класса, и вы не сможете получить доступ к методу задания в базовом классе.
  3. Пользовательские атрибуты не являются частью системы общих типов.

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

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

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

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

Дополнительные сведения см. в разделе System.Reflection.BindingFlags.

Если текущий Type представляет созданный универсальный тип, этот метод возвращает PropertyInfo параметры типа, замененные соответствующими аргументами типа.

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