Type.InvokeMember 方法

定义

调用当前 Type 的特定成员。

重载

InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[])

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

InvokeMember(String, BindingFlags, Binder, Object, Object[], CultureInfo)

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

InvokeMember(String, BindingFlags, Binder, Object, Object[])

使用指定的绑定约束并匹配指定的参数列表,调用指定成员。

InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[])

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

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 之一,如 PublicNonPublicPrivateInvokeMethodGetField 等。 查找类型无需指定。 如果省略查找的类型,则将使用 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 数组中的值将传递给这些参数。

返回

Object

一个对象,表示被调用成员的返回值。

实现

例外

invokeAttr 不包含 CreateInstance,并且 namenull

argsmodifiers 的长度不相同。

  • 或 - invokeAttr 不是有效的 BindingFlags 属性。

  • 或 - invokeAttr 不包含以下某个绑定标志:InvokeMethodCreateInstanceGetFieldSetFieldGetPropertySetProperty

  • 或 - invokeAttr 包含 CreateInstanceInvokeMethodGetFieldSetFieldGetPropertySetProperty 的组合。

  • 或 - invokeAttr 同时包含 GetFieldSetField

  • 或 - invokeAttr 同时包含 GetPropertySetProperty

  • 或 - invokeAttr 包含 InvokeMethodSetFieldSetProperty 的组合。

  • 或 - invokeAttr 包含 SetField,并且 args 具有多个元素。

  • 或 - 命名的参数数组大于参数数组。

  • 或 - 对 COM 对象调用了此方法,但以下绑定标志中有一个未传入:BindingFlags.InvokeMethodBindingFlags.GetPropertyBindingFlags.SetPropertyBindingFlags.PutDispPropertyBindingFlags.PutRefDispProperty

  • 或 - 其中一个命名参数数组包含一个值为 null 的字符串。

指定的成员是类初始值设定项。

找不到此字段或属性。

找不到与 args 中的参数匹配的方法。

  • 或 - 找不到具有 namedParameters 中提供的参数名称的成员。

  • 或 - 当前 Type 对象表示包含开放类型参数的类型,也就是说,ContainsGenericParameters 将返回 true

不能在 target 上调用指定的成员。

多个方法与绑定条件匹配。

name 表示的方法具有一个或多个未指定的泛型类型参数。 也就是说,此方法的 ContainsGenericParameters 属性将返回 true

注解

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

备注

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

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

尽管默认联编程序不) 处理 ParameterModifierCultureInfo (modifiersculture 参数,但你可以使用抽象 System.Reflection.Binder 类编写处理和的自定义联编程序 modifiers cultureParameterModifier 仅在通过 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

如果以下两个条件均为 true,则将调用方法:

  • 方法声明中的参数数目等于数组中的参数数目 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 。 除非你使用 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 开始,此方法可用于访问非公共成员(如果调用方已 ReflectionPermission 使用 ReflectionPermissionFlag.RestrictedMemberAccess 标志授予),并且如果非公共成员的授予集限制为调用方的授予集或其子集,则可使用此方法访问非公共成员。 (参阅 反射的安全注意事项)

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

另请参阅

适用于

InvokeMember(String, BindingFlags, Binder, Object, Object[], CultureInfo)

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

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 之一,如 PublicNonPublicPrivateInvokeMethodGetField 等。 查找类型无需指定。 如果省略查找的类型,则将使用 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)。

返回

Object

一个对象,表示被调用成员的返回值。

实现

例外

invokeAttr 不包含 CreateInstance,并且 namenull

invokeAttr 不是有效的 BindingFlags 属性。

  • 或 - invokeAttr 不包含以下某个绑定标志:InvokeMethodCreateInstanceGetFieldSetFieldGetPropertySetProperty

  • 或 - invokeAttr 包含 CreateInstanceInvokeMethodGetFieldSetFieldGetPropertySetProperty 的组合。

  • 或 - invokeAttr 同时包含 GetFieldSetField

  • 或 - invokeAttr 同时包含 GetPropertySetProperty

  • 或 - invokeAttr 包含 InvokeMethodSetFieldSetProperty 的组合。

  • 或 - invokeAttr 包含 SetField,并且 args 具有多个元素。

  • 或 - 对 COM 对象调用了此方法,但以下绑定标志中有一个未传入:BindingFlags.InvokeMethodBindingFlags.GetPropertyBindingFlags.SetPropertyBindingFlags.PutDispPropertyBindingFlags.PutRefDispProperty

  • 或 - 其中一个命名参数数组包含一个值为 null 的字符串。

指定的成员是类初始值设定项。

找不到此字段或属性。

找不到与 args 中的参数匹配的方法。

不能在 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.PublicBindingFlags.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 开始,如果向调用方授予了 标志,并且非公共成员的授予集限制为调用方的授予集或其子集,则此方法可用于访问非公共 ReflectionPermission ReflectionPermissionFlag.RestrictedMemberAccess 成员。 (反射 .) 的安全注意事项

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

另请参阅

适用于

InvokeMember(String, BindingFlags, Binder, Object, Object[])

使用指定的绑定约束并匹配指定的参数列表,调用指定成员。

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 之一,如 PublicNonPublicPrivateInvokeMethodGetField 等。 查找类型无需指定。 如果省略查找的类型,则将使用 BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static

binder
Binder

一个对象,该对象定义一组属性并启用绑定,而绑定可能涉及选择重载方法、强制参数类型和通过反射调用成员。

  • 或 - 要使用 Nothing 的空引用(在 Visual Basic 中为 DefaultBinder)。 请注意,为了成功地使用变量参数来调用方法重载,可能必须显式定义 Binder 对象。
target
Object

对其调用指定成员的对象。

args
Object[]

包含传递给要调用的成员的参数的数组。

返回

Object

一个对象,表示被调用成员的返回值。

实现

例外

invokeAttr 不包含 CreateInstance,并且 namenull

invokeAttr 不是有效的 BindingFlags 属性。

  • 或 - invokeAttr 不包含以下某个绑定标志:InvokeMethodCreateInstanceGetFieldSetFieldGetPropertySetProperty

  • 或 - invokeAttr 包含 CreateInstanceInvokeMethodGetFieldSetFieldGetPropertySetProperty 的组合。

  • 或 - invokeAttr 同时包含 GetFieldSetField

  • 或 - invokeAttr 同时包含 GetPropertySetProperty

  • 或 - invokeAttr 包含 InvokeMethodSetFieldSetProperty 的组合。

  • 或 - invokeAttr 包含 SetField,并且 args 具有多个元素。

  • 或 - 对 COM 对象调用了此方法,但以下绑定标志中有一个未传入:BindingFlags.InvokeMethodBindingFlags.GetPropertyBindingFlags.SetPropertyBindingFlags.PutDispPropertyBindingFlags.PutRefDispProperty

  • 或 - 其中一个命名参数数组包含一个值为 null 的字符串。

指定的成员是类初始值设定项。

找不到此字段或属性。

找不到与 args 中的参数匹配的方法。

不能在 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);
    }
}
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

如果以下两个条件均为 true,则将调用方法:

  • 方法声明中的参数数目等于数组中的参数数目 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 为3,则可以指定字符串 "[DispID = 3]" 而不是 "MyComMethod"。 DispID 调用成员比按名称查找成员的速度更快。 在复杂的聚合方案中,DispID 有时是调用所需成员的唯一方法。

备注

从 .NET Framework 2.0 Service Pack 1 开始,此方法可用于访问非公共成员(如果调用方已 ReflectionPermission 使用 ReflectionPermissionFlag.RestrictedMemberAccess 标志授予),并且如果非公共成员的授予集限制为调用方的授予集或其子集,则可使用此方法访问非公共成员。 (参阅 反射的安全注意事项)

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

另请参阅

适用于