Type.InvokeMember 方法

定義

叫用目前 Type 的特定成員。

多載

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

使用指定的繫結條件約束並符合指定的引數清單,來叫用指定的成員。

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

使用指定的繫結條件約束並符合指定的引數清單和文化特性 (Culture) 來叫用指定的成員。

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,例如 PublicNonPublicPrivateInvokeMethodGetField 等等。 不需要指定查閱的類型。 如果省略查閱的類型,則會使用 BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static

binder
Binder

定義一組屬性並啟用繫結的物件,可包含多載方法的選擇、引數類型的強制,以及透過反映的成員引動過程。

-或-

Null 參考 (在 Visual Basic 中為Nothing ),可使用 DefaultBinder。 請注意,可能需要明確定義 Binder 物件,才能順利以變數引數叫用方法多載。

target
Object

要在其上叫用指定成員的物件。

args
Object[]

包含引數的陣列,這些引數會傳遞給要叫用的成員。

傳回

表示叫用的成員之傳回值的物件。

實作

例外狀況

invokeAttr 不包含 CreateInstance,而且 namenull

invokeAttr 不是有效的 BindingFlags 屬性。

-或-

invokeAttr 不包含下列其中一個繫結旗標: InvokeMethodCreateInstanceGetFieldSetFieldGetPropertySetProperty

-或-

invokeAttr 包含與 CreateInstanceInvokeMethodGetFieldSetFieldGetProperty合併的 SetProperty

-或-

invokeAttr 同時包含 GetFieldSetField

-或-

invokeAttr 同時包含 GetPropertySetProperty

-或-

invokeAttr 包含與 InvokeMethodSetField 合併的 SetProperty

-或-

invokeAttr 包含 SetFieldargs 具有一個以上的項目。

-或-

已在 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.BindToMethodBinder 方法負責選取要叫用的方法。 默認系結器會選取最特定的相符專案。

完全信任的程式代碼會忽略存取限制;也就是說,只要完全信任程序代碼,就可以透過 System.Reflection 存取和叫用私用建構函式、方法、欄位和屬性。

您可以藉由指定 BindingFlags.SetField,使用 Type.InvokeMember 將欄位設定為特定值。 例如,如果您想要在類別 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 開始,如果呼叫端已使用 旗標授ReflectionPermissionReflectionPermissionFlag.RestrictedMemberAccess與呼叫端,以及非公用成員的授與集限制為呼叫端的授與集,或其中子集,則這個方法可用來存取非公用成員。 (請參閱 反映的安全性考慮。)

若要使用這項功能,您的應用程式應該以 .NET Framework 3.5 或更新版本為目標。

另請參閱

適用於

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

Source:
Type.cs
Source:
Type.cs
Source:
Type.cs

使用指定的繫結條件約束並符合指定的引數清單和文化特性 (Culture) 來叫用指定的成員。

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

定義一組屬性並啟用繫結的物件,可包含多載方法的選擇、引數類型的強制,以及透過反映的成員引動過程。

-或-

Null 參考 (在 Visual Basic 中為Nothing ),可使用 DefaultBinder。 請注意,可能需要明確定義 Binder 物件,才能順利以變數引數叫用方法多載。

target
Object

要在其上叫用指定成員的物件。

args
Object[]

包含引數的陣列,這些引數會傳遞給要叫用的成員。

culture
CultureInfo

表示要使用之全球化地區設定的物件,它可能是地區設定特性轉換所需要的,例如將數值 String 轉換成 Double

-或-

Null 參考 (Visual Basic 中的Nothing ),可使用目前執行緒的 CultureInfo

傳回

表示叫用的成員之傳回值的物件。

實作

例外狀況

invokeAttr 不包含 CreateInstance,而且 namenull

invokeAttr 不是有效的 BindingFlags 屬性。

-或-

invokeAttr 不包含下列其中一個繫結旗標: InvokeMethodCreateInstanceGetFieldSetFieldGetPropertySetProperty

-或-

invokeAttr 包含與 CreateInstanceInvokeMethodGetFieldSetFieldGetProperty合併的 SetProperty

-或-

invokeAttr 同時包含 GetFieldSetField

-或-

invokeAttr 同時包含 GetPropertySetProperty

-或-

invokeAttr 包含與 InvokeMethodSetField 合併的 SetProperty

-或-

invokeAttr 包含 SetFieldargs 具有一個以上的項目。

-或-

已在 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 表示叫用方法,但不是建構函式或型別初始化表達式。 對或SetProperty無效SetField。 如果 InvokeMethod 是由自己指定, BindingFlags.Public則會自動包含、 BindingFlags.InstanceBindingFlags.Static

  • GetField 取得欄位的值。 無效。SetField

  • SetField 表示設定欄位的值。 無效。GetField

  • GetProperty 取得屬性。 無效。SetProperty

  • SetProperty 表示設定屬性。 無效。GetProperty

如需相關資訊,請參閱 System.Reflection.BindingFlags

如果下列兩個條件都成立,將會叫用方法:

  • 方法宣告中的參數數目等於數位中的 args 自變數數目 (,除非在成員上定義預設自變數,而且 BindingFlags.OptionalParamBinding 指定) 。

  • 系結器可以將每個自變數的類型轉換成 參數的類型。

系結器會尋找所有相符的方法。 這些方法會根據要求 BindingFlags (值 InvokeMethodGetProperty、 等的系結類型來找到) 。 方法集會依名稱、自變數數目和系結器中定義的一組搜尋修飾詞進行篩選。

選取方法之後,就會叫用此方法。 此時會檢查輔助功能。 搜尋可能會根據與 方法相關聯的輔助功能屬性來控制搜尋哪一組方法。 類別 Binder.BindToMethodBinder 方法負責選取要叫用的方法。 默認系結器會選取最特定的相符專案。

完全信任的程式代碼會忽略存取限制;也就是說,每當程式代碼完全信任時,都可以透過反映來存取和叫用私人建構函式、方法、字段和屬性。

您可以藉由指定 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 開始,如果呼叫端已使用 旗標授ReflectionPermissionReflectionPermissionFlag.RestrictedMemberAccess與呼叫端,而且非公用成員的授與集限制為呼叫端的授與集,或是子集,則這個方法可用來存取非公用成員。 (請參閱 反映的安全性考慮。)

若要使用這項功能,您的應用程式應該以 .NET Framework 3.5 或更新版本為目標。

另請參閱

適用於

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,例如 PublicNonPublicPrivateInvokeMethodGetField 等等。 不需要指定查閱的類型。 如果省略查閱的類型,則會使用 BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static

binder
Binder

定義一組屬性並啟用繫結的物件,可包含多載方法的選擇、引數類型的強制,以及透過反映的成員引動過程。

-或-

Null 參考 (在 Visual Basic 中為 Nothing),可使用 DefaultBinder。 請注意,可能需要明確定義 Binder 物件,才能順利以變數引數叫用方法多載。

target
Object

要在其上叫用指定成員的物件。

args
Object[]

包含引數的陣列,這些引數會傳遞給要叫用的成員。

modifiers
ParameterModifier[]

ParameterModifier 物件的陣列,代表在 args 陣列中與對應項目關聯的屬性。 參數的關聯屬性儲存在成員的簽章中。

預設繫結器只會在呼叫 COM 元件時處理這個參數。

culture
CultureInfo

CultureInfo 物件,代表要使用的全球化地區設定,進行特定地區設定轉換時可能需要這個物件,例如將數值的 String 轉換成 Double。

-或-

Null 參考 (Visual Basic 中的Nothing ),可使用目前執行緒的 CultureInfo

namedParameters
String[]

陣列,包含 args 陣列中的值所要傳遞之目標參數的名稱。

傳回

表示叫用的成員之傳回值的物件。

實作

例外狀況

invokeAttr 不包含 CreateInstance,而且 namenull

argsmodifiers 的長度不同。

-或-

invokeAttr 不是有效的 BindingFlags 屬性。

-或-

invokeAttr 不包含下列其中一個繫結旗標: InvokeMethodCreateInstanceGetFieldSetFieldGetPropertySetProperty

-或-

invokeAttr 包含與 CreateInstanceInvokeMethodGetFieldSetFieldGetProperty合併的 SetProperty

-或-

invokeAttr 同時包含 GetFieldSetField

-或-

invokeAttr 同時包含 GetPropertySetProperty

-或-

invokeAttr 包含與 InvokeMethodSetField 合併的 SetProperty

-或-

invokeAttr 包含 SetFieldargs 具有一個以上的項目。

-或-

具名參數陣列大於引數陣列。

-或-

已在 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 有時是叫用所需成員的唯一方式。

雖然預設系結器不會處理ParameterModifierCultureInfo (和 參數) modifiers,但您可以使用抽象System.Reflection.Binder類來撰寫會處理 modifierscultureculture的自定義系結器。 ParameterModifier 只有在透過 COM Interop 呼叫時,才會使用,而且只會處理以傳址方式傳遞的參數。

namedParameters 陣列中的每個參數會在 args 陣列中取得對應項目的值。 如果 args 的長度大於 namedParameters 的長度,則會依序傳遞其餘引數值。

陣列 namedParameters 可用來變更輸入陣列中的自變數順序。 例如,假設在 Visual Basic) 和輸入數位{ 42, "x" }中 (M(ByVal a As String, ByVal b As Integer) 方法M(string a, int b),如果 提供 namedParameters陣列{ "b", "a" },則可以將輸入數位傳遞至 args

下列 BindingFlags 篩選旗標可用來定義要包含在搜尋中的成員:

  • 指定 BindingFlags.Public 以在搜尋中包含公用成員。

  • 指定 BindingFlags.NonPublic 在搜尋中包含非公用成員 (,也就是私人、內部和受保護的成員) 。

  • 指定 BindingFlags.FlattenHierarchy 以將靜態成員包含在階層中。

下列 BindingFlags 修飾詞旗標可用來變更搜尋的運作方式:

  • BindingFlags.IgnoreCase 表示忽略的大小 name寫。

  • BindingFlags.DeclaredOnly 只搜尋 在上 Type宣告的成員,而不是只繼承的成員。

下列 BindingFlags 調用旗標可用來表示要對成員採取的動作:

  • CreateInstance 叫用建構函式。 已忽略 name。 對其他調用旗標無效。

  • InvokeMethod 表示叫用方法,但不是建構函式或型別初始化表達式。 對或SetProperty無效SetField。 如果 InvokeMethod 是由自己指定, BindingFlags.Public則會自動包含、 BindingFlags.InstanceBindingFlags.Static

  • GetField 取得欄位的值。 無效。SetField

  • SetField 表示設定欄位的值。 無效。GetField

  • GetProperty 取得屬性。 無效。SetProperty

  • SetProperty 表示設定屬性。 無效。GetProperty

如需相關資訊,請參閱 System.Reflection.BindingFlags

如果下列兩個條件都成立,將會叫用方法:

  • 方法宣告中的參數數目等於數位中的 args 自變數數目 (,除非在成員上定義預設自變數,而且 BindingFlags.OptionalParamBinding 指定) 。

  • 系結器可以將每個自變數的類型轉換成 參數的類型。

系結器會尋找所有相符的方法。 這些方法是根據所要求的系結類型, (BindingFlagsInvokeMethodGetProperty等等) 。 方法集合會依名稱、自變數數目,以及系結器中定義的一組搜尋修飾詞進行篩選。

選取方法之後,就會叫用此方法。 此時會檢查輔助功能。 搜尋可能會根據與 方法相關聯的輔助功能屬性來控制搜尋哪一組方法。 類別 Binder.BindToMethodBinder 方法負責選取要叫用的方法。 默認系結器會選取最特定的相符專案。

InvokeMember 可用來叫用具有預設值之參數的方法。 若要系結至這些方法,必須指定 Reflection 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 開始,如果呼叫端已使用 旗標授與呼叫者,以及非公用成員的授ReflectionPermissionReflectionPermissionFlag.RestrictedMemberAccess與集僅限於呼叫端的授與集或子集,這個方法就可以用來存取非公用成員。 (請參閱 反映的安全性考慮。)

若要使用此功能,您的應用程式應以 .NET Framework 3.5 或更新版本為目標。

另請參閱

適用於