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[])

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

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);
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);
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.Instance | BindingFlags.Static.

binder
Binder

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

-или-

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

target
Object

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

args
Object[]

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

modifiers
ParameterModifier[]

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

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

culture
CultureInfo

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

-или-

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

namedParameters
String[]

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

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

Object

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

Реализации

Исключения

invokeAttr не содержит CreateInstance, а name равно null.

args и modifiers имеют разную длину.

-или-

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

-или-

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

-или-

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

-или-

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

-или-

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

-или-

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

-или-

invokeAttr содержит SetField, а args содержит более одного элемента.

-или-

Массив именованных параметров больше, чем массив аргументов.

-или-

Этот метод вызывается для объекта COM, и один из следующих флагов привязки не был передан: BindingFlags.InvokeMethod, BindingFlags.GetProperty, BindingFlags.SetProperty, BindingFlags.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 иногда является единственным способом вызова нужного элемента.

Хотя связыватель по умолчанию не обрабатывает или (параметры и culture ), абстрактный System.Reflection.Binder класс можно использовать для написания пользовательского средства привязки, обрабатывающего modifiers и culture.modifiersCultureInfoParameterModifier 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.Instanceи BindingFlags.Static .

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

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

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

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

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

Метод будет вызываться, если выполняются оба следующих условия:

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

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

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

После выбора метода он вызывается. На этом этапе проверяется специальные возможности. Поиск может управлять набором методов, в которых выполняется поиск на основе атрибута специальных возможностей, связанного с методом . Метод 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".

Примечание

Начиная с платформа .NET Framework 2.0 с ReflectionPermissionFlag.RestrictedMemberAccess пакетом обновления 1 (SP1), этот метод можно использовать для доступа к не открытым членам, если вызывающему объекту предоставлен ReflectionPermission флаг и если набор разрешений для не являющихся открытыми членов ограничен набором разрешений вызывающего объекта или его подмножеством. (См. раздел Вопросы безопасности для отражения.)

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

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

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

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

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

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);
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);
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.Instance | BindingFlags.Static.

binder
Binder

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

-или-

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

target
Object

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

args
Object[]

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

culture
CultureInfo

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

-или-

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

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

Object

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

Реализации

Исключения

invokeAttr не содержит CreateInstance, а name равно null.

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

-или-

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

-или-

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

-или-

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

-или-

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

-или-

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

-или-

invokeAttr содержит SetField, а args содержит более одного элемента.

-или-

Этот метод вызывается для объекта COM, и один из следующих флагов привязки не был передан: BindingFlags.InvokeMethod, BindingFlags.GetProperty, BindingFlags.SetProperty, BindingFlags.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.Instanceи BindingFlags.Static .

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

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

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

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

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

Метод будет вызываться, если выполняются оба следующих условия:

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

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

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

После выбора метода он вызывается. На этом этапе проверяется специальные возможности. Поиск может управлять набором методов, в которых выполняется поиск на основе атрибута специальных возможностей, связанного с методом . Метод 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 иногда является единственным способом вызова нужного элемента.

Примечание

Начиная с платформа .NET Framework 2.0 с ReflectionPermissionFlag.RestrictedMemberAccess пакетом обновления 1 (SP1), этот метод можно использовать для доступа к не открытым членам, если вызывающему объекту предоставлен ReflectionPermission флаг и если набор разрешений для не являющихся открытыми членов ограничен набором разрешений вызывающего объекта или его подмножеством. (См. раздел Вопросы безопасности для отражения.)

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

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

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

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

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

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);
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);
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.Instance | BindingFlags.Static.

binder
Binder

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

-или-

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

target
Object

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

args
Object[]

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

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

Object

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

Реализации

Исключения

invokeAttr не содержит CreateInstance, а name равно null.

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

-или-

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

-или-

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

-или-

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

-или-

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

-или-

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

-или-

invokeAttr содержит SetField, а args содержит более одного элемента.

-или-

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

-или-

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

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

Невозможно найти поле или свойство.

Невозможно найти метод, который соответствует аргументам в args.

-или-

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

Невозможно вызвать указанный член для target.

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

Платформа .NET Compact Framework сейчас не поддерживает этот метод.

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

Примеры

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

using namespace System;
using namespace System::Reflection;

// This sample class has a field, constructor, method, and property.
ref class MyType
{
private:
   Int32 myField;

public:
   MyType( interior_ptr<Int32> x )
   {
       *x *= 5;
   }

   virtual String^ ToString() override
   {
      return myField.ToString();
   }

   property Int32 MyProp 
   {
      Int32 get()
      {
         return myField;
      }

      void set( Int32 value )
      {
         if ( value < 1 )
                  throw gcnew ArgumentOutOfRangeException( "value",value,"value must be > 0" );

         myField = value;
      }
   }
};

int main()
{
   Type^ t = MyType::typeid;

   // Create an instance of a type.
   array<Object^>^args = {8};
   Console::WriteLine( "The value of x before the constructor is called is {0}.", args[ 0 ] );
   Object^ obj = t->InvokeMember( nullptr, static_cast<BindingFlags>(BindingFlags::DeclaredOnly | BindingFlags::Public | BindingFlags::NonPublic | BindingFlags::Instance | BindingFlags::CreateInstance), nullptr, nullptr, args );
   Console::WriteLine( "Type: {0}", obj->GetType() );
   Console::WriteLine( "The value of x after the constructor returns is {0}.", args[ 0 ] );

   // Read and write to a field.
   array<Object^>^obj5 = {5};
   t->InvokeMember( "myField", static_cast<BindingFlags>(BindingFlags::DeclaredOnly | BindingFlags::Public | BindingFlags::NonPublic | BindingFlags::Instance | BindingFlags::SetField), nullptr, obj, obj5 );
   Int32 v = safe_cast<Int32>(t->InvokeMember( "myField", static_cast<BindingFlags>(BindingFlags::DeclaredOnly | BindingFlags::Public | BindingFlags::NonPublic | BindingFlags::Instance | BindingFlags::GetField), nullptr, obj, nullptr ));
   Console::WriteLine( "myField: {0}", v );

   // Call a method.
   String^ s = safe_cast<String^>(t->InvokeMember( "ToString", static_cast<BindingFlags>(BindingFlags::DeclaredOnly | BindingFlags::Public | BindingFlags::NonPublic | BindingFlags::Instance | BindingFlags::InvokeMethod), nullptr, obj, nullptr ));
   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. 
      array<Object^>^obj0 = {(int^)0};
      t->InvokeMember( "MyProp", static_cast<BindingFlags>(BindingFlags::DeclaredOnly | BindingFlags::Public | BindingFlags::NonPublic | BindingFlags::Instance | BindingFlags::SetProperty), nullptr, obj, obj0 );
   }
   catch ( TargetInvocationException^ e ) 
   {
      // If the property assignment failed for some unexpected
      // reason, rethrow the TargetInvocationException.
      if ( e->InnerException->GetType() != ArgumentOutOfRangeException::typeid )
            throw;

      Console::WriteLine( "An invalid value was assigned to MyProp." );
   }

   array<Object^>^obj2 = {2};
   t->InvokeMember( "MyProp", static_cast<BindingFlags>(BindingFlags::DeclaredOnly | BindingFlags::Public | BindingFlags::NonPublic | BindingFlags::Instance | BindingFlags::SetProperty), nullptr, obj, obj2 );
   v =  safe_cast<Int32>(t->InvokeMember( "MyProp", static_cast<BindingFlags>(BindingFlags::DeclaredOnly | BindingFlags::Public | BindingFlags::NonPublic | BindingFlags::Instance | BindingFlags::GetProperty), nullptr, obj, nullptr ));
   Console::WriteLine( "MyProp: {0}", v );
}
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.Instanceи BindingFlags.Static .

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

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

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

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

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

Метод будет вызываться, если выполняются оба следующих условия:

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

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

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

После выбора метода он вызывается. На этом этапе проверяется специальные возможности. Поиск может управлять набором методов, в которых выполняется поиск на основе атрибута специальных возможностей, связанного с методом . Метод 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 иногда является единственным способом вызова нужного элемента.

Примечание

Начиная с платформа .NET Framework 2.0 с ReflectionPermissionFlag.RestrictedMemberAccess пакетом обновления 1 (SP1), этот метод можно использовать для доступа к не открытым членам, если вызывающему объекту предоставлен ReflectionPermission флаг и если набор разрешений для не являющихся открытыми членов ограничен набором разрешений вызывающего объекта или его подмножеством. (См. раздел Вопросы безопасности для отражения.)

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

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

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