Type.InvokeMember Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Вызывает определенный член текущего объекта Type.
Перегрузки
InvokeMember(String, BindingFlags, Binder, Object, Object[]) |
Вызывает указанный член, соответствующий заданным ограничениям привязки и указанному списку аргументов. |
InvokeMember(String, BindingFlags, Binder, Object, Object[], CultureInfo) |
Вызывает указанный член, соответствующий заданным ограничениям привязки, списку аргументов, а также языку и региональным параметрам. |
InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[]) |
При переопределении в производном классе вызывает указанный член, соответствующий заданным ограничениям привязки, списку аргументов, модификаторов, а также языку и региональным параметрам. |
InvokeMember(String, BindingFlags, Binder, Object, Object[])
- Исходный код:
- 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);
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[]
Массив с аргументами, передаваемыми вызываемому члену.
Возвращаемое значение
Объект, представляющий возвращаемое значение вызываемого элемента.
Реализации
Исключения
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 или более поздней версии.
См. также раздел
- String
- Binder
- DefaultBinder
- BindingFlags
- ParameterModifier
- ParameterAttributes
- CultureInfo
- ReflectionPermission
Применяется к
InvokeMember(String, BindingFlags, Binder, Object, Object[], CultureInfo)
- Исходный код:
- 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);
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 текущего потока.
Возвращаемое значение
Объект, представляющий возвращаемое значение вызываемого элемента.
Реализации
Исключения
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 или более поздней версии.
См. также раздел
- String
- Binder
- DefaultBinder
- BindingFlags
- ParameterModifier
- ParameterAttributes
- CultureInfo
- ReflectionPermission
Применяется к
InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[])
- Исходный код:
- 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);
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
.
Возвращаемое значение
Объект, представляющий возвращаемое значение вызываемого элемента.
Реализации
Исключения
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
.modifiers
CultureInfoParameterModifier
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 или более поздней версии.
См. также раздел
- String
- Binder
- DefaultBinder
- BindingFlags
- ParameterModifier
- ParameterAttributes
- CultureInfo
- ReflectionPermission