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


Type.InvokeMember Метод

Определение

Вызывает определенный член текущего Type.

Перегрузки

Имя Описание
InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[])

При переопределении в производном классе вызывает указанный член, используя указанные ограничения привязки и сопоставляя указанный список аргументов, модификаторы и региональные параметры.

InvokeMember(String, BindingFlags, Binder, Object, Object[], CultureInfo)

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

InvokeMember(String, BindingFlags, Binder, Object, Object[])

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

InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[])

Исходный код:
Type.cs
Исходный код:
Type.cs
Исходный код:
Type.cs
Исходный код:
Type.cs
Исходный код:
Type.cs

При переопределении в производном классе вызывает указанный член, используя указанные ограничения привязки и сопоставляя указанный список аргументов, модификаторы и региональные параметры.

public:
 abstract System::Object ^ InvokeMember(System::String ^ name, System::Reflection::BindingFlags invokeAttr, System::Reflection::Binder ^ binder, System::Object ^ target, cli::array <System::Object ^> ^ args, cli::array <System::Reflection::ParameterModifier> ^ modifiers, System::Globalization::CultureInfo ^ culture, cli::array <System::String ^> ^ namedParameters);
[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicProperties | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicProperties)]
public abstract object? InvokeMember(string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder? binder, object? target, object?[]? args, System.Reflection.ParameterModifier[]? modifiers, System.Globalization.CultureInfo? culture, string[]? namedParameters);
[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.All)]
public abstract object? InvokeMember(string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder? binder, object? target, object?[]? args, System.Reflection.ParameterModifier[]? modifiers, System.Globalization.CultureInfo? culture, string[]? namedParameters);
public abstract object InvokeMember(string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, object target, object[] args, System.Reflection.ParameterModifier[] modifiers, System.Globalization.CultureInfo culture, string[] namedParameters);
public abstract object? InvokeMember(string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder? binder, object? target, object?[]? args, System.Reflection.ParameterModifier[]? modifiers, System.Globalization.CultureInfo? culture, string[]? namedParameters);
[<System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicProperties | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicProperties)>]
abstract member InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] * System.Reflection.ParameterModifier[] * System.Globalization.CultureInfo * string[] -> obj
[<System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.All)>]
abstract member InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] * System.Reflection.ParameterModifier[] * System.Globalization.CultureInfo * string[] -> obj
abstract member InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] * System.Reflection.ParameterModifier[] * System.Globalization.CultureInfo * string[] -> obj
Public MustOverride Function InvokeMember (name As String, invokeAttr As BindingFlags, binder As Binder, target As Object, args As Object(), modifiers As ParameterModifier(), culture As CultureInfo, namedParameters As String()) As Object

Параметры

name
String

Строка, содержащая имя конструктора, метода, свойства или элемента поля для вызова.

–или–

Пустая строка ("") для вызова элемента по умолчанию.

–или–

Для IDispatch членов строка, представляющая DispID, например [DispID=3].

invokeAttr
BindingFlags

Побитовое сочетание значений перечисления, указывающее, как выполняется поиск. Доступ может быть одним из BindingFlags таких, как Public, NonPublic, Private, InvokeMethodи GetFieldт. д. Тип подстановки не должен быть указан. Если тип подстановки опущен, BindingFlags.Public | | BindingFlags.InstanceBindingFlags.Static используется.

binder
Binder

Объект, который определяет набор свойств и включает привязку, которая может включать выбор перегруженного метода, приведение типов аргументов и вызов элемента через отражение.

–или–

Ссылка null (Nothing в Visual Basic) для использования DefaultBinder. Обратите внимание, что явное определение Binder объекта может потребоваться для успешного вызова перегрузки метода с аргументами переменной.

target
Object

Объект, на котором вызывается указанный элемент.

args
Object[]

Массив, содержащий аргументы для передачи в член для вызова.

modifiers
ParameterModifier[]

Массив объектов ParameterModifier, представляющих атрибуты, связанные с соответствующим элементом в массиве args. Связанные атрибуты параметра хранятся в сигнатуре члена.

Привязка по умолчанию обрабатывает этот параметр только при вызове COM-компонента.

culture
CultureInfo

Объект CultureInfo , представляющий языковой стандарт глобализации для использования, который может потребоваться для преобразования языкового стандарта, например преобразования числовых строк в double.

–или–

Ссылка на null (Nothing в Visual Basic) для использования текущего потока CultureInfo.

namedParameters
String[]

Массив, содержащий имена параметров, в которые передаются значения в args массиве.

Возвращаемое значение

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

Реализации

Атрибуты

Исключения

invokeAttrне содержит и не содержит CreateInstancenull.name

args и modifiers не имеют той же длины.

–или–

invokeAttr не является допустимым BindingFlags атрибутом.

–или–

invokeAttrне содержит один из следующих флагов привязки: InvokeMethod, CreateInstance, , GetField, SetFieldGetPropertyили SetProperty.

–или–

invokeAttrсодержит в сочетании CreateInstance с InvokeMethod, GetField, , SetFieldGetPropertyили SetProperty.

–или–

invokeAttr содержит оба GetField и SetField.

–или–

invokeAttr содержит оба GetProperty и SetProperty.

–или–

invokeAttr содержится в сочетании InvokeMethod с SetField или SetProperty.

–или–

invokeAttr SetField содержит и args содержит несколько элементов.

–или–

Именованный массив параметров больше массива аргументов.

–или–

Этот метод вызывается для COM-объекта, и один из следующих флагов привязки не был передан в: BindingFlags.InvokeMethod, , BindingFlags.GetProperty, BindingFlags.SetPropertyBindingFlags.PutDispPropertyили BindingFlags.PutRefDispProperty.

–или–

Один из именованных массивов параметров содержит строку, которая является null.

Указанный член является инициализатором класса.

Не удается найти поле или свойство.

Метод не найден, соответствующий аргументам.args

–или–

Элемент не найден, в который указаны namedParametersимена аргументов.

–или–

Текущий Type объект представляет тип, содержащий параметры открытого типа, то есть ContainsGenericParameters возвращает true.

Указанный элемент нельзя вызвать target.

Несколько методов соответствуют критериям привязки.

Метод, представленный одним или несколькими name неопределенными параметрами универсального типа. То есть свойство метода ContainsGenericParameters возвращается true.

Комментарии

InvokeMember вызывает член конструктора или член метода, получает или задает элемент свойства, получает или задает член поля данных или получает или задает элемент элемента элемента массива.

Замечание

Нельзя использовать InvokeMember для вызова универсального метода.

При вызове IDispatch элемента можно указать dispID вместо имени члена, используя строковый формат "[DispID=##]". Например, если значение DispID myComMethod равно 3, можно указать строку "[DispID=3]" вместо "MyComMethod". Вызов члена с помощью DispID быстрее, чем поиск элемента по имени. В сложных сценариях агрегирования dispID иногда является единственным способом вызова требуемого элемента.

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

Каждый параметр в массиве namedParameters получает значение в соответствующем элементе в массиве args . Если длина больше длины args , остальные значения аргументов namedParametersпередаются в порядке.

Массив namedParameters можно использовать для изменения порядка аргументов в входном массиве. Например, учитывая метод M(string a, int b) (M(ByVal a As String, ByVal b As Integer) в Visual Basic) и входной массив { 42, "x" }, входной массив можно передать без изменений в args, если массив { "b", "a" } предоставляется для namedParameters.

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

  • Укажите BindingFlags.Public , чтобы включить общедоступные члены в поиск.

  • Укажите BindingFlags.NonPublic , чтобы включить не открытые члены (т. е. частные, внутренние и защищенные элементы) в поиск.

  • Укажите BindingFlags.FlattenHierarchy , чтобы включить статические члены в иерархию.

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

  • BindingFlags.IgnoreCase игнорировать регистр name.

  • BindingFlags.DeclaredOnly поиск только членов, объявленных на Typeнее, а не наследуемые.

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

  • CreateInstance для вызова конструктора. name не учитывается. Недопустимо с другими флагами вызова.

  • InvokeMethod для вызова метода, но не конструктора или инициализатора типов. Недопустимый с SetField или SetProperty. Если InvokeMethod задано само по себе, BindingFlags.Publicи BindingFlags.InstanceBindingFlags.Static автоматически включаются.

  • GetField чтобы получить значение поля. Недопустимый с SetField.

  • SetField значение поля. Недопустимый с GetField.

  • GetProperty для получения свойства. Недопустимый с SetProperty.

  • SetProperty , чтобы задать свойство. Недопустимый с GetProperty.

См. System.Reflection.BindingFlags для получения дополнительной информации.

Метод вызывается, если оба из следующих условий имеют значение true:

  • Число параметров в объявлении метода равно числу аргументов в args массиве (если аргументы по умолчанию не определены в элементе и BindingFlags.OptionalParamBinding указаны).

  • Тип каждого аргумента можно преобразовать привязщиком в тип параметра.

Привязчик найдет все соответствующие методы. Эти методы обнаруживаются на основе типа запрошенной привязки (BindingFlagsзначений InvokeMethodGetPropertyи т. д.). Набор методов фильтруется по имени, количеству аргументов и набору модификаторов поиска, определенных в привязке.

После выбора метода он вызывается. Специальные возможности проверяются на этом этапе. Поиск может управлять набором методов поиска на основе атрибута специальных возможностей, связанного с методом. Метод Binder.BindToMethodBinder класса отвечает за выбор вызываемого метода. Привязка по умолчанию выбирает наиболее конкретное совпадение.

InvokeMember можно использовать для вызова методов с параметрами, имеющими значения по умолчанию. Для привязки к этим методам необходимо BindingFlags.OptionalParamBinding указать отражение. Для параметра, имеющего значение по умолчанию, можно указать другое значение или указать Missing.Value для использования значения по умолчанию.

Например, рассмотрим метод, например MyMethod(int x, float y = 2.0). Чтобы вызвать этот метод только с первым аргументом в качестве MyMethod(4), передайте один из указанных выше флагов привязки и передайте два аргумента, а именно 4 для первого аргумента и Missing.Value второго аргумента. Если вы не используете Missing.Value, вы не можете исключить необязательные параметры с методом Invoke . Если это необходимо сделать, используйте InvokeMember вместо этого.

Ограничения доступа игнорируются для полностью доверенного кода; То есть к частным конструкторам, методам, полям и свойствам можно обращаться и вызывать каждый System.Reflection раз, когда код полностью доверяется.

Можно использовать Type.InvokeMember для задания поля определенному значению, указав BindingFlags.SetField. Например, если вы хотите задать поле общедоступного экземпляра с именем F в классе C и F, Stringможно использовать такой код, как:

typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {"strings new value"}, null, null, null);

Если F является, String[]можно использовать такой код, как:

typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {new String[]{"a","z","c","d"}}, null, null, null);

который инициализирует поле F в этом новом массиве. Можно также использовать Type.InvokeMember для задания позиции в массиве, указав индекс значения, а затем следующее значение с помощью кода, например следующего:

typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {1, "b"}, null, null, null);

Это приведет к изменению строки "z" в массиве, который F содержит строку "b".

Замечание

Этот метод можно использовать для доступа к недоступным членам, если вызывающий объект был предоставлен ReflectionPermission с ReflectionPermissionFlag.RestrictedMemberAccess флагом, и если набор грантов, не являющихся открытыми, ограничен набором предоставления вызывающего объекта или подмножеством. (См. вопросы безопасности для отражения.)

Чтобы использовать эту функцию, приложение должно использовать платформу .NET Framework 3.5 или более поздней версии.

См. также раздел

Применяется к

InvokeMember(String, BindingFlags, Binder, Object, Object[], CultureInfo)

Исходный код:
Type.cs
Исходный код:
Type.cs
Исходный код:
Type.cs
Исходный код:
Type.cs
Исходный код:
Type.cs

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

public:
 System::Object ^ InvokeMember(System::String ^ name, System::Reflection::BindingFlags invokeAttr, System::Reflection::Binder ^ binder, System::Object ^ target, cli::array <System::Object ^> ^ args, System::Globalization::CultureInfo ^ culture);
public:
 virtual System::Object ^ InvokeMember(System::String ^ name, System::Reflection::BindingFlags invokeAttr, System::Reflection::Binder ^ binder, System::Object ^ target, cli::array <System::Object ^> ^ args, System::Globalization::CultureInfo ^ culture);
[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicProperties | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicProperties)]
public object? InvokeMember(string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder? binder, object? target, object?[]? args, System.Globalization.CultureInfo? culture);
[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.All)]
public object? InvokeMember(string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder? binder, object? target, object?[]? args, System.Globalization.CultureInfo? culture);
public object InvokeMember(string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, object target, object[] args, System.Globalization.CultureInfo culture);
public object? InvokeMember(string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder? binder, object? target, object?[]? args, System.Globalization.CultureInfo? culture);
[<System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicProperties | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicProperties)>]
member this.InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] * System.Globalization.CultureInfo -> obj
[<System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.All)>]
member this.InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] * System.Globalization.CultureInfo -> obj
member this.InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] * System.Globalization.CultureInfo -> obj
abstract member InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] * System.Globalization.CultureInfo -> obj
override this.InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] * System.Globalization.CultureInfo -> obj
Public Function InvokeMember (name As String, invokeAttr As BindingFlags, binder As Binder, target As Object, args As Object(), culture As CultureInfo) As Object

Параметры

name
String

Строка, содержащая имя конструктора, метода, свойства или элемента поля для вызова.

–или–

Пустая строка ("") для вызова элемента по умолчанию.

–или–

Для IDispatch членов строка, представляющая DispID, например [DispID=3].

invokeAttr
BindingFlags

Побитовое сочетание значений перечисления, указывающее, как выполняется поиск. Доступ может быть одним из BindingFlags таких, как Public, NonPublic, Private, InvokeMethodи GetFieldт. д. Тип подстановки не должен быть указан. Если тип подстановки опущен, BindingFlags.Public | | BindingFlags.InstanceBindingFlags.Static используется.

binder
Binder

Объект, который определяет набор свойств и включает привязку, которая может включать выбор перегруженного метода, приведение типов аргументов и вызов элемента через отражение.

–или–

Ссылка null (Nothing в Visual Basic) используется DefaultBinder. Обратите внимание, что явное определение Binder объекта может потребоваться для успешного вызова перегрузки метода с аргументами переменной.

target
Object

Объект, на котором вызывается указанный элемент.

args
Object[]

Массив, содержащий аргументы для передачи в член для вызова.

culture
CultureInfo

Объект, представляющий языковой стандарт глобализации для использования, который может потребоваться для преобразования конкретного языкового стандарта, например преобразования числового String стандарта в .Double

–или–

Ссылка на null (Nothing в Visual Basic) для использования текущего потока CultureInfo.

Возвращаемое значение

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

Реализации

Атрибуты

Исключения

invokeAttrне содержит и не содержит CreateInstancenull.name

invokeAttr не является допустимым BindingFlags атрибутом.

–или–

invokeAttrне содержит один из следующих флагов привязки: InvokeMethod, CreateInstance, , GetField, SetFieldGetPropertyили SetProperty.

–или–

invokeAttrсодержит в сочетании CreateInstance с InvokeMethod, GetField, , SetFieldGetPropertyили SetProperty.

–или–

invokeAttr содержит оба GetField и SetField.

–или–

invokeAttr содержит оба GetProperty и SetProperty.

–или–

invokeAttr содержится в сочетании InvokeMethod с SetField или SetProperty.

–или–

invokeAttr SetField содержит и args содержит несколько элементов.

–или–

Этот метод вызывается для COM-объекта, и один из следующих флагов привязки не был передан в: BindingFlags.InvokeMethod, , BindingFlags.GetProperty, BindingFlags.SetPropertyBindingFlags.PutDispPropertyили BindingFlags.PutRefDispProperty.

–или–

Один из именованных массивов параметров содержит строку, которая является null.

Указанный член является инициализатором класса.

Не удается найти поле или свойство.

Метод не найден, соответствующий аргументам.args

–или–

Текущий Type объект представляет тип, содержащий параметры открытого типа, то есть ContainsGenericParameters возвращает true.

Указанный элемент нельзя вызвать target.

Несколько методов соответствуют критериям привязки.

Метод, представленный одним или несколькими name неопределенными параметрами универсального типа. То есть свойство метода ContainsGenericParameters возвращается true.

Комментарии

Хотя привязка по умолчанию не выполняет обработку для CultureInfo (culture параметр), можно использовать абстрактный класс System.Reflection.Binder, чтобы создать пользовательский привязчик, который обрабатывает culture.

Замечание

Нельзя использовать InvokeMember для вызова универсального метода.

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

  • Укажите BindingFlags.Public , чтобы включить общедоступные члены в поиск.

  • Укажите BindingFlags.NonPublic , чтобы включить не открытые члены (т. е. частные, внутренние и защищенные элементы) в поиск.

  • Укажите BindingFlags.FlattenHierarchy , чтобы включить статические члены в иерархию.

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

  • BindingFlags.IgnoreCase игнорировать регистр name.

  • BindingFlags.DeclaredOnly поиск только членов, объявленных на Typeнее, а не наследуемые.

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

  • CreateInstance для вызова конструктора. name не учитывается. Недопустимо с другими флагами вызова.

  • InvokeMethod для вызова метода, но не конструктора или инициализатора типов. Недопустимый с SetField или SetProperty. Если InvokeMethod задано само по себе, BindingFlags.Publicи BindingFlags.InstanceBindingFlags.Static автоматически включаются.

  • GetField чтобы получить значение поля. Недопустимый с SetField.

  • SetField значение поля. Недопустимый с GetField.

  • GetProperty для получения свойства. Недопустимый с SetProperty.

  • SetProperty , чтобы задать свойство. Недопустимый с GetProperty.

См. System.Reflection.BindingFlags для получения дополнительной информации.

Метод вызывается, если оба из следующих условий имеют значение true:

  • Число параметров в объявлении метода равно числу аргументов в args массиве (если аргументы по умолчанию не определены в элементе и BindingFlags.OptionalParamBinding указаны).

  • Тип каждого аргумента можно преобразовать привязщиком в тип параметра.

Привязчик найдет все соответствующие методы. Эти методы обнаруживаются на основе типа запрошенной привязки (BindingFlagsзначений InvokeMethodGetPropertyи т. д.). Набор методов фильтруется по имени, количеству аргументов и набору модификаторов поиска, определенных в привязке.

После выбора метода он вызывается. Специальные возможности проверяются на этом этапе. Поиск может управлять набором методов поиска на основе атрибута специальных возможностей, связанного с методом. Метод Binder.BindToMethodBinder класса отвечает за выбор вызываемого метода. Привязка по умолчанию выбирает наиболее конкретное совпадение.

Ограничения доступа игнорируются для полностью доверенного кода; т. е. частные конструкторы, методы, поля и свойства могут быть доступны и вызваны с помощью отражения всякий раз, когда код полностью доверяется.

Можно использовать Type.InvokeMember для задания поля определенному значению, указав BindingFlags.SetField. Например, если вы хотите задать поле общедоступного экземпляра с именем F в классе C, а F — это String код, например:

typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {"strings new value"}, null);

Если F является, String[]можно использовать такой код, как:

typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {new String[]{"a","z","c","d"}}, null);

который инициализирует поле F в этом новом массиве. Можно также использовать Type.InvokeMember для задания позиции в массиве, указав индекс значения, а затем следующее значение с помощью кода, например следующего:

typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {1, "b"}, null);

Это приведет к изменению строки "z" в массиве, который F содержит строку "b".

При вызове IDispatch элемента можно указать dispID вместо имени члена, используя строковый формат "[DispID=##]". Например, если значение DispID myComMethod равно 3, можно указать строку "[DispID=3]" вместо "MyComMethod". Вызов члена с помощью DispID быстрее, чем поиск элемента по имени. В сложных сценариях агрегирования dispID иногда является единственным способом вызова требуемого элемента.

Замечание

Этот метод можно использовать для доступа к недоступным членам, если вызывающий объект был предоставлен ReflectionPermission с ReflectionPermissionFlag.RestrictedMemberAccess флагом, и если набор грантов, не являющихся открытыми, ограничен набором предоставления вызывающего объекта или подмножеством. (См. вопросы безопасности для отражения.)

Чтобы использовать эту функцию, приложение должно использовать платформу .NET Framework 3.5 или более поздней версии.

См. также раздел

Применяется к

InvokeMember(String, BindingFlags, Binder, Object, Object[])

Исходный код:
Type.cs
Исходный код:
Type.cs
Исходный код:
Type.cs
Исходный код:
Type.cs
Исходный код:
Type.cs

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

public:
 System::Object ^ InvokeMember(System::String ^ name, System::Reflection::BindingFlags invokeAttr, System::Reflection::Binder ^ binder, System::Object ^ target, cli::array <System::Object ^> ^ args);
public:
 virtual System::Object ^ InvokeMember(System::String ^ name, System::Reflection::BindingFlags invokeAttr, System::Reflection::Binder ^ binder, System::Object ^ target, cli::array <System::Object ^> ^ args);
[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicProperties | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicProperties)]
public object? InvokeMember(string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder? binder, object? target, object?[]? args);
[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.All)]
public object? InvokeMember(string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder? binder, object? target, object?[]? args);
public object InvokeMember(string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, object target, object[] args);
public object? InvokeMember(string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder? binder, object? target, object?[]? args);
[<System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicProperties | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicProperties)>]
member this.InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] -> obj
[<System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.All)>]
member this.InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] -> obj
member this.InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] -> obj
abstract member InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] -> obj
override this.InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] -> obj
Public Function InvokeMember (name As String, invokeAttr As BindingFlags, binder As Binder, target As Object, args As Object()) As Object

Параметры

name
String

Строка, содержащая имя конструктора, метода, свойства или элемента поля для вызова.

–или–

Пустая строка ("") для вызова элемента по умолчанию.

–или–

Для IDispatch членов строка, представляющая DispID, например [DispID=3].

invokeAttr
BindingFlags

Побитовое сочетание значений перечисления, указывающее, как выполняется поиск. Доступ может быть одним из BindingFlags таких, как Public, NonPublic, Private, InvokeMethodи GetFieldт. д. Тип подстановки не должен быть указан. Если тип подстановки опущен, BindingFlags.Public | | BindingFlags.InstanceBindingFlags.Static используется.

binder
Binder

Объект, который определяет набор свойств и включает привязку, которая может включать выбор перегруженного метода, приведение типов аргументов и вызов элемента через отражение.

–или–

Ссылка null (Nothing в Visual Basic) используется DefaultBinder. Обратите внимание, что явное определение Binder объекта может потребоваться для успешного вызова перегрузки метода с аргументами переменной.

target
Object

Объект, на котором вызывается указанный элемент.

args
Object[]

Массив, содержащий аргументы для передачи в член для вызова.

Возвращаемое значение

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

Реализации

Атрибуты

Исключения

invokeAttrне содержит и не содержит CreateInstancenull.name

invokeAttr не является допустимым BindingFlags атрибутом.

–или–

invokeAttrне содержит один из следующих флагов привязки: InvokeMethod, CreateInstance, , GetField, SetFieldGetPropertyили SetProperty.

–или–

invokeAttrсодержит в сочетании CreateInstance с InvokeMethod, GetField, , SetFieldGetPropertyили SetProperty.

–или–

invokeAttr содержит оба GetField и SetField.

–или–

invokeAttr содержит оба GetProperty и SetProperty.

–или–

invokeAttr содержится в сочетании InvokeMethod с SetField или SetProperty.

–или–

invokeAttr SetField содержит и args содержит несколько элементов.

–или–

Этот метод вызывается для COM-объекта, и один из следующих флагов привязки не был передан в: BindingFlags.InvokeMethod, , BindingFlags.GetProperty, BindingFlags.SetPropertyBindingFlags.PutDispPropertyили BindingFlags.PutRefDispProperty.

–или–

Один из именованных массивов параметров содержит строку, которая является null.

Указанный член является инициализатором класса.

Не удается найти поле или свойство.

Метод не найден, соответствующий аргументам.args

–или–

Текущий Type объект представляет тип, содержащий параметры открытого типа, то есть ContainsGenericParameters возвращает true.

Указанный элемент нельзя вызвать target.

Несколько методов соответствуют критериям привязки.

В настоящее время .NET Compact Framework не поддерживает этот метод.

Метод, представленный одним или несколькими name неопределенными параметрами универсального типа. То есть свойство метода ContainsGenericParameters возвращается true.

Примеры

В следующем примере используется InvokeMember для доступа к членам типа.

using System;
using System.Reflection;

// This sample class has a field, constructor, method, and property.
class MyType
{
    Int32 myField;
    public MyType(ref Int32 x) {x *= 5;}
    public override String ToString() {return myField.ToString();}
    public Int32 MyProp
    {
        get {return myField;}
        set
        {
            if (value < 1)
                throw new ArgumentOutOfRangeException("value", value, "value must be > 0");
            myField = value;
        }
    }
}

class MyApp
{
    static void Main()
    {
        Type t = typeof(MyType);
        // Create an instance of a type.
        Object[] args = new Object[] {8};
        Console.WriteLine("The value of x before the constructor is called is {0}.", args[0]);
        Object obj = t.InvokeMember(null,
            BindingFlags.DeclaredOnly |
            BindingFlags.Public | BindingFlags.NonPublic |
            BindingFlags.Instance | BindingFlags.CreateInstance, null, null, args);
        Console.WriteLine("Type: " + obj.GetType().ToString());
        Console.WriteLine("The value of x after the constructor returns is {0}.", args[0]);

        // Read and write to a field.
        t.InvokeMember("myField",
            BindingFlags.DeclaredOnly |
            BindingFlags.Public | BindingFlags.NonPublic |
            BindingFlags.Instance | BindingFlags.SetField, null, obj, new Object[] {5});
        Int32 v = (Int32) t.InvokeMember("myField",
            BindingFlags.DeclaredOnly |
            BindingFlags.Public | BindingFlags.NonPublic |
            BindingFlags.Instance | BindingFlags.GetField, null, obj, null);
        Console.WriteLine("myField: " + v);

        // Call a method.
        String s = (String) t.InvokeMember("ToString",
            BindingFlags.DeclaredOnly |
            BindingFlags.Public | BindingFlags.NonPublic |
            BindingFlags.Instance | BindingFlags.InvokeMethod, null, obj, null);
        Console.WriteLine("ToString: " + s);

        // Read and write a property. First, attempt to assign an
        // invalid value; then assign a valid value; finally, get
        // the value.
        try
        {
            // Assign the value zero to MyProp. The Property Set
            // throws an exception, because zero is an invalid value.
            // InvokeMember catches the exception, and throws
            // TargetInvocationException. To discover the real cause
            // you must catch TargetInvocationException and examine
            // the inner exception.
            t.InvokeMember("MyProp",
                BindingFlags.DeclaredOnly |
                BindingFlags.Public | BindingFlags.NonPublic |
                BindingFlags.Instance | BindingFlags.SetProperty, null, obj, new Object[] {0});
        }
        catch (TargetInvocationException e)
        {
            // If the property assignment failed for some unexpected
            // reason, rethrow the TargetInvocationException.
            if (e.InnerException.GetType() !=
                typeof(ArgumentOutOfRangeException))
                throw;
            Console.WriteLine("An invalid value was assigned to MyProp.");
        }
        t.InvokeMember("MyProp",
            BindingFlags.DeclaredOnly |
            BindingFlags.Public | BindingFlags.NonPublic |
            BindingFlags.Instance | BindingFlags.SetProperty, null, obj, new Object[] {2});
        v = (Int32) t.InvokeMember("MyProp",
            BindingFlags.DeclaredOnly |
            BindingFlags.Public | BindingFlags.NonPublic |
            BindingFlags.Instance | BindingFlags.GetProperty, null, obj, null);
        Console.WriteLine("MyProp: " + v);
    }
}
open System
open System.Reflection

// This sample class has a field, constructor, method, and property.
type MyType() =
    let mutable myField = 0

    member _.MyType(x: int byref) =
        x <- x * 5
    
    override _.ToString() =
        string myField
    
    member _.MyProp
        with get () = myField
        and set value =
            if value < 1 then
                raise (ArgumentOutOfRangeException("value", value, "value must be > 0"))
            myField <- value

let t = typeof<MyType>
// Create an instance of a type.
let args = Array.zeroCreate<obj> 8
printfn $"The value of x before the constructor is called is {args[0]}."
let obj = t.InvokeMember(null,
    BindingFlags.DeclaredOnly |||
    BindingFlags.Public ||| BindingFlags.NonPublic |||
    BindingFlags.Instance ||| BindingFlags.CreateInstance, null, null, args)
printfn $"Type: {obj.GetType()}"
printfn $"The value of x after the constructor returns is {args[0]}."

// Read and write to a field.
t.InvokeMember("myField",
    BindingFlags.DeclaredOnly |||
    BindingFlags.Public ||| BindingFlags.NonPublic |||
    BindingFlags.Instance ||| BindingFlags.SetField, null, obj, Array.zeroCreate<obj> 5) |> ignore
let v = t.InvokeMember("myField",
    BindingFlags.DeclaredOnly |||
    BindingFlags.Public ||| BindingFlags.NonPublic |||
    BindingFlags.Instance ||| BindingFlags.GetField, null, obj, null) :?> int
printfn $"myField: {v}"

// Call a method.
let s = t.InvokeMember("ToString",
    BindingFlags.DeclaredOnly |||
    BindingFlags.Public ||| BindingFlags.NonPublic |||
    BindingFlags.Instance ||| BindingFlags.InvokeMethod, null, obj, null) :?> string
printfn $"ToString: {s}"

// Read and write a property. First, attempt to assign an
// invalid value then assign a valid value finally, get
// the value.
try
    // Assign the value zero to MyProp. The Property Set
    // throws an exception, because zero is an invalid value.
    // InvokeMember catches the exception, and throws
    // TargetInvocationException. To discover the real cause
    // you must catch TargetInvocationException and examine
    // the inner exception.
    t.InvokeMember("MyProp",
        BindingFlags.DeclaredOnly |||
        BindingFlags.Public ||| BindingFlags.NonPublic |||
        BindingFlags.Instance ||| BindingFlags.SetProperty, null, obj, Array.zeroCreate<obj> 0) |> ignore
with :? TargetInvocationException as e ->
    // If the property assignment failed for some unexpected
    // reason, rethrow the TargetInvocationException.
    if e.InnerException.GetType() <> typeof<ArgumentOutOfRangeException> then
        reraise ()
    printfn "An invalid value was assigned to MyProp."
t.InvokeMember("MyProp",
    BindingFlags.DeclaredOnly |||
    BindingFlags.Public ||| BindingFlags.NonPublic |||
    BindingFlags.Instance ||| BindingFlags.SetProperty, null, obj, Array.zeroCreate<obj> 2) |> ignore
let v2 = t.InvokeMember("MyProp",
    BindingFlags.DeclaredOnly |||
    BindingFlags.Public ||| BindingFlags.NonPublic |||
    BindingFlags.Instance ||| BindingFlags.GetProperty, null, obj, null)
printfn $"MyProp: {v2}"
Imports System.Reflection

' This sample class has a field, constructor, method, and property.
Class MyType
    Private myField As Int32

    Public Sub New(ByRef x As Int32)
        x *= 5
    End Sub

    Public Overrides Function ToString() As [String]
        Return myField.ToString()
    End Function 'ToString

    Public Property MyProp() As Int32
        Get
            Return myField
        End Get
        Set(ByVal Value As Int32)
            If Value < 1 Then
                Throw New ArgumentOutOfRangeException("value", Value, "value must be > 0")
            End If
            myField = Value
        End Set
    End Property
End Class

Class MyApp

    Shared Sub Main()
        Dim t As Type = GetType(MyType)
        ' Create an instance of a type.
        Dim args() As [Object] = {8}
        Console.WriteLine("The value of x before the constructor is called is {0}.", args(0))
        Dim obj As [Object] = t.InvokeMember(Nothing, BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.CreateInstance, Nothing, Nothing, args)
        Console.WriteLine("Type: {0}", obj.GetType().ToString())
        Console.WriteLine("The value of x after the constructor returns is {0}.", args(0))

        ' Read and write to a field.
        t.InvokeMember("myField", BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.SetField, Nothing, obj, New [Object]() {5})
        Dim v As Int32 = CType(t.InvokeMember("myField", BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.GetField, Nothing, obj, Nothing), Int32)
        Console.WriteLine("myField: {0}", v)

        ' Call a method.
        Dim s As [String] = CType(t.InvokeMember("ToString", BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.InvokeMethod, Nothing, obj, Nothing), [String])
        Console.WriteLine("ToString: {0}", s)

        ' Read and write a property. First, attempt to assign an
        ' invalid value; then assign a valid value; finally, get
        ' the value.
        Try
            ' Assign the value zero to MyProp. The Property Set 
            ' throws an exception, because zero is an invalid value.
            ' InvokeMember catches the exception, and throws 
            ' TargetInvocationException. To discover the real cause
            ' you must catch TargetInvocationException and examine
            ' the inner exception. 
            t.InvokeMember("MyProp", BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.SetProperty, Nothing, obj, New [Object]() {0})
        Catch e As TargetInvocationException
            ' If the property assignment failed for some unexpected
            ' reason, rethrow the TargetInvocationException.
            If Not e.InnerException.GetType() Is GetType(ArgumentOutOfRangeException) Then
                Throw
            End If
            Console.WriteLine("An invalid value was assigned to MyProp.")
        End Try
        t.InvokeMember("MyProp", BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.SetProperty, Nothing, obj, New [Object]() {2})
        v = CType(t.InvokeMember("MyProp", BindingFlags.DeclaredOnly Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.GetProperty, Nothing, obj, Nothing), Int32)
        Console.WriteLine("MyProp: {0}", v)
    End Sub
End Class

Комментарии

Замечание

Нельзя использовать InvokeMember для вызова универсального метода.

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

  • Укажите BindingFlags.Public , чтобы включить общедоступные члены в поиск.

  • Укажите BindingFlags.NonPublic , чтобы включить не открытые члены (т. е. частные и защищенные) в поиск.

  • Укажите BindingFlags.FlattenHierarchy , чтобы включить статические члены в иерархию.

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

  • BindingFlags.IgnoreCase игнорировать регистр name.

  • BindingFlags.DeclaredOnly поиск только членов, объявленных на Typeнее, а не наследуемые.

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

  • CreateInstance для вызова конструктора. name не учитывается. Недопустимо с другими флагами вызова.

  • InvokeMethod для вызова метода, но не конструктора или инициализатора типов. Недопустимый с SetField или SetProperty. Если InvokeMethod задано само по себе, BindingFlags.Publicи BindingFlags.InstanceBindingFlags.Static автоматически включаются.

  • GetField чтобы получить значение поля. Недопустимый с SetField.

  • SetField значение поля. Недопустимый с GetField.

  • GetProperty для получения свойства. Недопустимый с SetProperty.

  • SetProperty , чтобы задать свойство. Недопустимый с GetProperty.

См. System.Reflection.BindingFlags для получения дополнительной информации.

Метод вызывается, если оба из следующих условий имеют значение true:

  • Число параметров в объявлении метода равно числу аргументов в args массиве (если аргументы по умолчанию не определены в элементе и BindingFlags.OptionalParamBinding указаны).

  • Тип каждого аргумента можно преобразовать привязщиком в тип параметра.

Привязчик найдет все соответствующие методы. Эти методы обнаруживаются на основе типа запрошенной привязки (BindingFlagsзначений InvokeMethodGetPropertyи т. д.). Набор методов фильтруется по имени, количеству аргументов и набору модификаторов поиска, определенных в привязке.

После выбора метода он вызывается. Специальные возможности проверяются на этом этапе. Поиск может управлять набором методов поиска на основе атрибута специальных возможностей, связанного с методом. Метод Binder.BindToMethodBinder класса отвечает за выбор вызываемого метода. Привязка по умолчанию выбирает наиболее конкретное совпадение.

Ограничения доступа игнорируются для полностью доверенного кода; То есть к частным конструкторам, методам, полям и свойствам можно обращаться и вызывать каждый System.Reflection раз, когда код полностью доверяется.

Можно использовать Type.InvokeMember для задания поля определенному значению, указав BindingFlags.SetField. Например, если вы хотите задать поле общедоступного экземпляра с именем F в классе C и F, Stringможно использовать такой код, как:

typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {"strings new value"});

Если F является, String[]можно использовать такой код, как:

typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {new String[]{"a","z","c","d"}});

который инициализирует поле F в этом новом массиве. Можно также использовать Type.InvokeMember для задания позиции в массиве, указав индекс значения, а затем следующее значение с помощью кода, например следующего:

typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {1, "b"});

Это приведет к изменению строки "z" в массиве, который F содержит строку "b".

При вызове IDispatch элемента можно указать dispID вместо имени члена, используя строковый формат "[DispID=##]". Например, если значение DispID myComMethod равно 3, можно указать строку "[DispID=3]" вместо "MyComMethod". Вызов члена с помощью DispID быстрее, чем поиск элемента по имени. В сложных сценариях агрегирования dispID иногда является единственным способом вызова требуемого элемента.

Замечание

Этот метод можно использовать для доступа к недоступным членам, если вызывающий объект был предоставлен ReflectionPermission с ReflectionPermissionFlag.RestrictedMemberAccess флагом, и если набор грантов, не являющихся открытыми, ограничен набором предоставления вызывающего объекта или подмножеством. (См. вопросы безопасности для отражения.)

Чтобы использовать эту функцию, приложение должно использовать платформу .NET Framework 3.5 или более поздней версии.

См. также раздел

Применяется к