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
。modifiers
CultureInfoParameterModifier
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