System.Type.InvokeMember 方法 (String, BindingFlags, Binder, Object, Object[], CultureInfo)

方法描述

使用指定的绑定约束和匹配的指定参数列表及区域性来调用指定成员。

语法定义(C# System.Type.InvokeMember 方法 (String, BindingFlags, Binder, Object, Object[], CultureInfo) 的用法)

public Object InvokeMember(
	string name,
	BindingFlags invokeAttr,
	Binder binder,
	Object target,
	Object[] args,
	CultureInfo culture
)

参数/返回值

参数值/返回值 参数类型/返回类型 参数描述/返回描述
name System-String 字符串,它包含要调用的构造函数、方法、属性或字段成员的名称。- 或 -空字符串 (""),表示调用默认成员。- 或 -对于 IDispatch 成员,则为一个表示 DispID 的字符串,例如“[DispID=3]”。
invokeAttr System-Reflection-BindingFlags 一个位屏蔽,由一个或多个指定搜索执行方式的 BindingFlags 组成。访问可以是 BindingFlags 之一,如 Public、NonPublic、Private、InvokeMethod 和 GetField 等。查找类型无需指定。如果省略查找的类型,则将使用 BindingFlags.Public使用 BindingFlags.Static。
binder System-Reflection-Binder 一个对象,该对象定义一组属性并启用绑定,而绑定可能涉及选择重载方法、强制参数类型和通过反射调用成员。- 或 -空引用(Visual Basic 中为 Nothing)将使用 DefaultBinder。请注意,为了成功地使用变量参数来调用方法重载,可能必须显式定义 Binder 对象。
target System-Object 对其调用指定成员的对象。
args System-Object[] 包含传递给要调用的成员的参数的数组。
culture System-Globalization-CultureInfo 表示要使用的全局化区域设置的对象,它对区域设置特定的转换可能是必需的,比如将数字 String 转换为 Double。- 或 -(空引用( Visual Basic 中的 Nothing),要使用当前线程的 CultureInfo。
返回值 System.Object 一个对象,表示被调用成员的。

提示和注释

虽然默认联编程序不处理 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)。

每个参数 (argument) 的类型可以被联编程序转换为参数 (parameter) 类型。

联编程序将查找所有的匹配方法。 查找这些方法时基于所请求的绑定类型(BindingFlags 值 InvokeMethod、GetProperty 等)。 方法集按名称、参数数目、联编程序中定义的一组搜索修饰符进行筛选。

选择方法后,方法即被调用。 同时检查可访问性。 搜索可能基于与此方法关联的可访问性特性来控制搜索哪些方法集。 Binder 类的 Binder.BindToMethod 方法负责选择要调用的方法。 默认联编程序选择最精确的匹配。

对于完全受信任的代码将忽略访问限制;即,只要代码是完全受信任的,就可以通过反射访问和调用私有的构造函数、方法、字段和属性。

通过指定 BindingFlags.SetField,可以使用 Type.InvokeMember 将某个字段设置为特定值。 例如,如果要设置 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,并且非公共成员的授予集限制为调用方的授予集或其子集,则此方法可用于访问非公共成员。 (请参见 反射的安全注意事项。)

若要使用此功能,您的应用程序应面向 .NET Framework 3.5 版 或更高版本。

System.Type.InvokeMember 方法 (String, BindingFlags, Binder, Object, Object[], CultureInfo)例子


异常

异常 异常描述
ArgumentNullException invokeAttr 不包含 CreateInstance 并且 name 为 null。
ArgumentException
  • invokeAttr 不是有效的 BindingFlags 特性。
  • invokeAttr 不包含下列绑定标志之一:InvokeMethod、CreateInstance、GetField、SetField、GetProperty 或 SetProperty。
  • invokeAttr 包含与 InvokeMethod、GetField、SetField、GetProperty 或 SetProperty 组合的 CreateInstance。
  • invokeAttr 同时包含 GetField 和 SetField。
  • invokeAttr 同时包含 GetProperty 和 SetProperty。
  • invokeAttr 包含与 SetField 或 SetProperty 组合的 InvokeMethod。
  • invokeAttr 包含 SetField,并且 args 具有一个以上的元素。
  • 对 COM 对象调用此方法,且未传入下列绑定标志之一:BindingFlags.InvokeMethod、BindingFlags.GetProperty、BindingFlags.SetProperty、BindingFlags.PutDispProperty 或 BindingFlags.PutRefDispProperty。
  • 某个命名参数数组包含一个为 null 的字符串。
MethodAccessException 指定的成员是类初始值设定项。
MissingFieldException 找不到该字段或属性。
MissingMethodException
  • 找不到任何与 args 中的参数匹配的方法。
  • 当前 Type 对象表示包含开放类型参数的类型,即 ContainsGenericParameters 返回 true。
TargetException 在 target 上无法调用指定的成员。
AmbiguousMatchException 多个方法匹配绑定条件。
InvalidOperationException 由 name 表示的方法具有一个或多个未指定的泛型类型参数。 即,该方法的 ContainsGenericParameters 属性返回 true。

命名空间

namespace: System

程序集: mscorlib(在 mscorlib.dll 中)

版本信息

.NET Framework 受以下版本支持:4、3.5、3.0、2.0、1.1、1.0 .NET Framework Client Profile 受以下版本支持:4、3.5 SP1

适用平台

Windows 7, Windows Vista SP1 或更高版本, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008(不支持服务器核心), Windows Server 2008 R2(支持 SP1 或更高版本的服务器核心), Windows Server 2003 SP2 .NET Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求。