Type.InvokeMember 方法

定义

调用当前 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[])

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

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[]

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

返回

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

实现

例外

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 中的参数匹配的方法。

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

不能在 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 调用 方法,但不能调用构造函数或类型初始值设定项。 对 SetFieldSetProperty无效。 如果 InvokeMethod 由自身指定, BindingFlags.Public则会自动包括 、 BindingFlags.InstanceBindingFlags.Static

  • GetField 获取字段的值。 对 SetField无效。

  • SetField 设置字段的值。 对 GetField无效。

  • GetProperty 获取属性。 对 SetProperty无效。

  • SetProperty 设置属性。 对 GetProperty无效。

有关更多信息,请参见System.Reflection.BindingFlags

如果满足以下两个条件,将调用 方法:

  • 方法声明中的参数数等于数组 (中的 args 参数数,除非在 成员上定义了默认参数,并且 BindingFlags.OptionalParamBinding) 指定。

  • 每个参数的类型都可以由绑定器转换为参数的类型。

绑定器将查找所有匹配的方法。 这些方法基于请求的绑定类型 (BindingFlagsInvokeMethodGetProperty等) 。 方法集按名称、参数数和绑定器中定义的一组搜索修饰符进行筛选。

选择 方法后,将调用该方法。 此时会检查辅助功能。 搜索可以根据与方法关联的辅助功能属性控制搜索哪组方法。 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 或更高版本。

另请参阅

适用于

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)。

返回

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

实现

例外

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 中的参数匹配的方法。

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

不能在 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 调用 方法,但不能调用构造函数或类型初始值设定项。 对 SetFieldSetProperty无效。 如果 InvokeMethod 由自身指定, BindingFlags.Public则会自动包括 、 BindingFlags.InstanceBindingFlags.Static

  • GetField 获取字段的值。 对 SetField无效。

  • SetField 设置字段的值。 对 GetField无效。

  • GetProperty 获取属性。 对 SetProperty无效。

  • SetProperty 设置属性。 对 GetProperty无效。

有关更多信息,请参见System.Reflection.BindingFlags

如果满足以下两个条件,将调用 方法:

  • 方法声明中的参数数等于数组 (中的 args 参数数,除非在 成员上定义了默认参数,并且 BindingFlags.OptionalParamBinding) 指定。

  • 每个参数的类型都可以由绑定器转换为参数的类型。

绑定器将查找所有匹配的方法。 这些方法基于请求的绑定类型 (BindingFlagsInvokeMethodGetProperty等) 。 方法集按名称、参数数和绑定器中定义的一组搜索修饰符进行筛选。

选择 方法后,将调用该方法。 此时会检查辅助功能。 搜索可以根据与方法关联的辅助功能属性控制搜索哪组方法。 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 或更高版本。

另请参阅

适用于

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 数组中的值将传递给这些参数。

返回

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

实现

例外

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 的 DispID 为 3,则可以指定字符串“[DispID=3]”,而不是“MyComMethod”。 通过 DispID 调用成员比按名称查找成员更快。 在复杂的聚合方案中,DispID 有时是调用所需成员的唯一方法。

尽管默认绑定器不处理或 () 和 culture 参数,但可以使用抽象System.Reflection.Binder类编写处理 和 culture的自定义绑定程序modifiersmodifiersCultureInfoParameterModifier 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 调用 方法,但不能调用构造函数或类型初始值设定项。 对 SetFieldSetProperty无效。 如果 InvokeMethod 由自身指定, BindingFlags.Public则会自动包括 、 BindingFlags.InstanceBindingFlags.Static

  • GetField 获取字段的值。 对 SetField无效。

  • SetField 设置字段的值。 对 GetField无效。

  • GetProperty 获取属性。 对 SetProperty无效。

  • SetProperty 设置属性。 对 GetProperty无效。

有关更多信息,请参见System.Reflection.BindingFlags

如果满足以下两个条件,将调用 方法:

  • 方法声明中的参数数等于数组 (中的 args 参数数,除非在 成员上定义了默认参数,并且 BindingFlags.OptionalParamBinding) 指定。

  • 每个参数的类型都可以由绑定器转换为参数的类型。

绑定器将查找所有匹配的方法。 这些方法基于请求的绑定类型 (BindingFlagsInvokeMethodGetProperty等) 。 方法集按名称、参数数和绑定器中定义的一组搜索修饰符进行筛选。

选择 方法后,将调用该方法。 此时会检查辅助功能。 搜索可以根据与方法关联的辅助功能属性控制搜索哪组方法。 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 或更高版本。

另请参阅

适用于