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

方法描述

当在派生类中重写时,使用指定的绑定约束并匹配指定的参数列表、修饰符和区域性,调用指定成员。

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

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

参数/返回值

参数值/返回值 参数类型/返回类型 参数描述/返回描述
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 为空),要使用 DefaultBinder。请注意,为了成功地使用变量参数来调用方法重载,可能必须显式定义 Binder 对象。
target System-Object 对其调用指定成员的对象。
args System-Object[] 包含传递给要调用的成员的参数的数组。
modifiers System-Reflection-ParameterModifier[] ParameterModifier 对象数组,表示与 args 数组中的相应元素关联的特性。参数的关联的特性存储在成员的签名中。只有在调用 COM 组件时,默认联编程序才处理此参数。
culture System-Globalization-CultureInfo 表示要使用的全局化区域设置的 CultureInfo 对象,它对区域设置特定的转换可能是必需的,比如将数字 String 转换为 Double。- 或 -(空引用( Visual Basic 中的 Nothing),要使用当前线程的 CultureInfo。
namedParameters System-String[] 包含参数名称的数组,args 数组中的值被传递给这些参数。
返回值 System.Object 一个对象,表示被调用成员的。

提示和注释

InvokeMember 调用构造函数成员或方法成员,获取或设置属性成员,获取或设置数据字段成员,或者获取或设置数组成员的元素。

注意

不能使用 InvokeMember 来调用泛型方法。

当调用 IDispatch 成员时,可以使用字符串格式“[DispID=##]”指定 DispID 而非成员名称。 例如,如果 MyComMethod 的 DispID 为 3,则可以指定字符串“[DispID=3]”而不是“MyComMethod”。 按 DispID 调用成员比按名称查找成员快。 在复杂的聚合方案中,DispID 有时是调用所需成员的唯一方式。

虽然默认联编程序不处理 ParameterModifier 或 CultureInfo(modifiers 和 culture 参数),但您可以使用抽象 System.Reflection.Binder 类来编写处理 modifiers 和 culture 的自定义联编程序。 ParameterModifier 仅当通过 COM 互操作进行调用时才使用,而且仅处理通过引用传递的参数。

namedParameters 数组中的每一个参数获取 args 数组中相应元素中的值。 如果 args 的长度大于 namedParameters 的长度,则按顺序传递剩余的参数值。

namedParameters 数组可用于更改输入数组中的参数的顺序。 例如,假设方法 M(string a, int b)(在 Visual Basic 中为 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)。

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

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

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

InvokeMember 可用于调用带参数(这些参数有默认值)的方法。 要绑定到这些方法,“反射”要求指定 BindingFlags.OptionalParamBinding。 对于具有默认值的参数,可以提供不同的值,也可以提供 Missing.Value 以使用默认值。

例如,请看这个方法 MyMethod(int x, float y = 2.0)。 若要调用只带第一个参数的此方法,即 MyMethod(4),请传递上面的绑定标志之一并传递两个参数,即第一个参数为 4,第二个参数为 Missing.Value。 除非使用 Missing.Value,否则不能省略 Invoke 方法的可选参数。 如果必须这样做,则使用 InvokeMember 代替。

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

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

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

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


异常

异常 异常描述
ArgumentNullException invokeAttr 不包含 CreateInstance 并且 name 为 null。
ArgumentException
  • args 和 modifiers 的长度不同。
  • 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 中的参数匹配的方法。
  • 找不到任何成员具有 namedParameters 中提供的参数名称。
  • 当前 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 系统要求。