Type.InvokeMember 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
调用当前 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[])
- Source:
- Type.cs
- Source:
- Type.cs
- Source:
- 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 的字符串。
指定的成员是类初始值设定项。
找不到此字段或属性。
不能在 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.BindToMethod类的 Binder 方法负责选择要调用的方法。 默认绑定器选择最具体的匹配项。
对于完全受信任的代码,将忽略访问限制;也就是说,只要代码完全受信任,就可以通过 System.Reflection 访问和调用专用构造函数、方法、字段和属性。
可以通过 Type.InvokeMember 指定 BindingFlags.SetField来将字段设置为特定值。 例如,如果要在类 C 上设置名为 F 的公共实例字段,而 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"});
这会将 F 保存的数组中的字符串“z”更改为字符串“b”。
调用成员 IDispatch 时,可以使用字符串格式“[DispID=##]”指定 DispID 而不是成员名称。 例如,如果 MyComMethod 的 DispID 为 3,则可以指定字符串“[DispID=3]”,而不是“MyComMethod”。 通过 DispID 调用成员比按名称查找成员更快。 在复杂的聚合方案中,DispID 有时是调用所需成员的唯一方法。
注意
从 .NET Framework 2.0 Service Pack 1 开始,如果调用方已使用 ReflectionPermissionFlag.RestrictedMemberAccess 标志授予ReflectionPermission调用方,并且非公共成员的授予集限制为调用方授权集或其子集,则此方法可用于访问非公共成员。 (请参阅 Reflection 的安全 注意事项.)
若要使用此功能,应用程序应面向 .NET Framework 3.5 或更高版本。
另请参阅
- String
- Binder
- DefaultBinder
- BindingFlags
- ParameterModifier
- ParameterAttributes
- CultureInfo
- ReflectionPermission
适用于
InvokeMember(String, BindingFlags, Binder, Object, Object[], CultureInfo)
- Source:
- Type.cs
- Source:
- Type.cs
- Source:
- 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 的字符串。
指定的成员是类初始值设定项。
找不到此字段或属性。
不能在 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.BindToMethod类的 Binder 方法负责选择要调用的方法。 默认绑定器选择最具体的匹配项。
对于完全受信任的代码,将忽略访问限制;也就是说,只要代码完全受信任,就可以通过反射访问和调用私有构造函数、方法、字段和属性。
可以通过 Type.InvokeMember 指定 BindingFlags.SetField来将字段设置为特定值。 例如,如果要在类 C 上设置名为 F 的公共实例字段,而 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);
这会将 F 保存的数组中的字符串“z”更改为字符串“b”。
调用 IDispatch 成员时,可以使用字符串格式“[DispID=##]”指定 DispID 而不是成员名称。 例如,如果 MyComMethod 的 DispID 为 3,则可以指定字符串“[DispID=3]”,而不是“MyComMethod”。 通过 DispID 调用成员比按名称查找成员更快。 在复杂的聚合方案中,DispID 有时是调用所需成员的唯一方法。
注意
从 .NET Framework 2.0 Service Pack 1 开始,如果调用方已使用 ReflectionPermissionFlag.RestrictedMemberAccess 标志授予ReflectionPermission调用方,并且非公共成员的授予集限制为调用方授权集或其子集,则此方法可用于访问非公共成员。 (请参阅 Reflection 的安全 注意事项.)
若要使用此功能,应用程序应面向 .NET Framework 3.5 或更高版本。
另请参阅
- String
- Binder
- DefaultBinder
- BindingFlags
- ParameterModifier
- ParameterAttributes
- CultureInfo
- ReflectionPermission
适用于
InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[])
- Source:
- Type.cs
- Source:
- Type.cs
- Source:
- 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
一个对象,该对象定义一组属性并启用绑定,而绑定可能涉及选择重载方法、强制参数类型和通过反射调用成员。
或
要使用 DefaultBinder 的空引用(在 Visual Basic 中为 Nothing)。 请注意,为了成功地使用变量参数来调用方法重载,可能必须显式定义 Binder 对象。
- target
- Object
对其调用指定成员的对象。
- args
- Object[]
包含传递给要调用的成员的参数的数组。
- modifiers
- ParameterModifier[]
ParameterModifier 对象的数组,表示与 args 数组中的相应元素关联的特性。 参数的关联的属性存储在成员的签名中。
只有在调用 COM 组件时,默认联编程序才处理此参数。
- culture
- CultureInfo
表示要使用的全局化区域设置的 CultureInfo 对象,它对区域设置特定的转换可能是必需的,比如将数字 String 转换为 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 而不是成员名称。 例如,如果 MyComMethod 的 DispID 为 3,则可以指定字符串“[DispID=3]”,而不是“MyComMethod”。 通过 DispID 调用成员比按名称查找成员更快。 在复杂的聚合方案中,DispID 有时是调用所需成员的唯一方法。
尽管默认绑定器不处理或 () 和 culture 参数,但可以使用抽象System.Reflection.Binder类编写处理 和 culture的自定义绑定程序modifiers。modifiersCultureInfoParameterModifier
ParameterModifier 仅在通过 COM 互操作调用时才使用,并且仅处理由引用传递的参数。
namedParameters 数组中的每个参数对应 args 数组中的元素来获取值。 如果 args 的长度大于 namedParameters 的长度,则剩余的自变量值将按顺序传递。
数组 namedParameters 可用于更改输入数组中参数的顺序。 例如,给定 Visual Basic) 中的 方法 M(string a, int b) (M(ByVal a As String, ByVal b As Integer) 和输入数组{ 42, "x" },如果为 namedParameters提供数组,则可以将输入数组{ "b", "a" }原样args传递到 。
以下 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.BindToMethod类的 Binder 方法负责选择要调用的方法。 默认绑定器选择最具体的匹配项。
InvokeMember 可用于调用具有默认值的参数的方法。 若要绑定到这些方法,需要 BindingFlags.OptionalParamBinding 指定反射。 对于具有默认值的参数,可以提供其他值,也可以提供 Missing.Value 以使用默认值。
例如,考虑 MyMethod (int x, float y = 2.0) 等方法。 若要仅使用第一个参数作为 MyMethod (4) 调用此方法,请传递上述绑定标志之一,并传递两个参数,即第一个参数的 4,第二个参数 Missing.Value 为 4。 除非使用 Missing.Value,否则不能在 方法中省略可选参数 Invoke 。 如果必须这样做,请改用 InvokeMember 。
对于完全受信任的代码,将忽略访问限制;也就是说,只要代码完全受信任,就可以通过 System.Reflection 访问和调用专用构造函数、方法、字段和属性。
可以通过 Type.InvokeMember 指定 BindingFlags.SetField来将字段设置为特定值。 例如,如果要在类 C 上设置名为 F 的公共实例字段,而 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);
这会将 F 保存的数组中的字符串“z”更改为字符串“b”。
注意
从 .NET Framework 2.0 Service Pack 1 开始,如果调用方已使用 ReflectionPermissionFlag.RestrictedMemberAccess 标志授予ReflectionPermission调用方,并且非公共成员的授予集限制为调用方授权集或其子集,则此方法可用于访问非公共成员。 (请参阅 Reflection 的安全 注意事项.)
若要使用此功能,应用程序应面向 .NET Framework 3.5 或更高版本。
另请参阅
- String
- Binder
- DefaultBinder
- BindingFlags
- ParameterModifier
- ParameterAttributes
- CultureInfo
- ReflectionPermission