Type.InvokeMember Methode

Definition

Ruft einen bestimmten Member vom aktuellen Type auf.

Überlädt

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

Ruft den angegebenen Member auf, der den angegebenen Bindungseinschränkungen und der angegebenen Argumentliste entspricht.

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

Ruft den angegebenen Member auf, der den angegebenen Bindungseinschränkungen sowie der angegebenen Argumentliste und Kultur entspricht.

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

Ruft nach Überschreiben in einer abgeleiteten Klasse den angegebenen Member auf, der den angegebenen Bindungseinschränkungen sowie der angegebenen Argumentliste, den Modifizierern und der Kultur entspricht.

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

Ruft den angegebenen Member auf, der den angegebenen Bindungseinschränkungen und der angegebenen Argumentliste entspricht.

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

Parameter

name
String

Die Zeichenfolge, die den Namen des Konstruktors, der Methode, der Eigenschaft oder des Feldmembers enthält, der bzw. die aufgerufen werden soll.

- oder -

Eine leere Zeichenfolge ("") zum Aufrufen des Standardmembers.

- oder -

Für IDispatch-Member eine Zeichenfolge, die die DispID darstellt, z. B. "[DispID=3]".

invokeAttr
BindingFlags

Eine bitweise Kombination der Enumerationswerte, die angeben, wie die Suche durchgeführt wird. Der Zugriff kann aus einem der BindingFlags wie Public, NonPublic, Private, InvokeMethod, GetField usw. bestehen. Die Art der Suche muss nicht angegeben werden. Wenn die Art der Suche nicht angegeben ist, werden BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static verwendet.

binder
Binder

Ein Objekt, das eine Gruppe von Eigenschaften definiert und eine Bindung ermöglicht. Dazu kann die Auswahl einer überladenen Methode, die Umwandlung von Argumenttypen und der Aufruf eines Members durch Reflektion gehören.

- oder -

Ein Nullverweis (Nothing in Visual Basic), wenn DefaultBinder verwendet werden soll. Beachten Sie, dass möglicherweise ein Binder-Objekt explizit definiert werden muss, um erfolgreich Methodenüberladungen mit Variablenargumenten aufrufen zu können.

target
Object

Das Objekt, für das der angegebene Member aufgerufen werden soll.

args
Object[]

Ein Array mit den Argumenten, die dem aufzurufenden Member übergeben werden sollen.

Gibt zurück

Ein Objekt, das den Rückgabewert des aufgerufenen Members darstellt.

Implementiert

Ausnahmen

invokeAttr enthält keine CreateInstance, und name ist null.

invokeAttr ist kein gültiges BindingFlags-Attribut.

- oder -

invokeAttr enthält keines der folgenden Bindungsflags: InvokeMethod, CreateInstance, GetField, SetField, GetProperty oder SetProperty.

- oder -

invokeAttr enthält CreateInstance in Kombination mit InvokeMethod, GetField, SetField, GetProperty oder SetProperty.

- oder -

invokeAttr enthält sowohl GetField als auch SetField.

- oder -

invokeAttr enthält sowohl GetProperty als auch SetProperty.

- oder -

invokeAttr enthält InvokeMethod in Kombination mit SetField oder SetProperty.

- oder -

invokeAttr enthält SetField, und args enthält mehr als ein Element.

- oder -

Diese Methode wird für ein COM-Objekt aufgerufen, und eines der folgenden Bindungsflags wurde nicht übergeben: BindingFlags.InvokeMethod, BindingFlags.GetProperty, BindingFlags.SetProperty, BindingFlags.PutDispProperty oder BindingFlags.PutRefDispProperty.

- oder -

Eines der benannten Parameterarrays enthält eine Zeichenfolge, die null ist.

Der angegebene Member ist ein Klasseninitialisierer.

Das Feld oder die Eigenschaft wurde nicht gefunden.

Es wurde keine Methode gefunden, die den Argumenten in args entspricht.

- oder -

Das aktuelle Type-Objekt stellt einen Typ dar, der offene Typparameter enthält. Das bedeutet, dass ContainsGenericParameters den Wert true zurückgibt.

Der angegebene Member kann nicht für target aufgerufen werden.

Mehrere Methoden entsprechen den Bindungskriterien.

Diese Methode wird von .NET Compact Framework derzeit nicht unterstützt.

Die durch name dargestellte Methode enthält mindestens einen nicht angegebenen generischen Typparameter. Das bedeutet, dass die ContainsGenericParameters-Eigenschaft der Methode true zurückgibt.

Beispiele

Im folgenden Beispiel wird verwendet InvokeMember , um auf Member eines Typs zuzugreifen.

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

Hinweise

Hinweis

Sie können nicht verwenden InvokeMember , um eine generische Methode aufzurufen.

Die folgenden BindingFlags Filterflags können verwendet werden, um zu definieren, welche Member in die Suche einbezogen werden sollen:

  • Geben Sie an BindingFlags.Public , um öffentliche Member in die Suche einzuschließen.

  • Geben Sie an BindingFlags.NonPublic , dass nicht öffentliche Member (d. h. private und geschützte Member) in die Suche einbezogen werden sollen.

  • Geben Sie an BindingFlags.FlattenHierarchy , um statische Member nach oben in die Hierarchie einzuschließen.

Die folgenden BindingFlags Modifiziererflags können verwendet werden, um die Funktionsweise der Suche zu ändern:

  • BindingFlags.IgnoreCase , um den Fall von namezu ignorieren.

  • BindingFlags.DeclaredOnly , um nur die Member zu durchsuchen, die Typefür deklariert sind, und nicht die Elemente, die einfach geerbt wurden.

Die folgenden BindingFlags Aufrufflags können verwendet werden, um anzugeben, welche Aktion mit dem Member ausgeführt werden soll:

  • CreateInstance , um einen Konstruktor aufzurufen. name wird ignoriert. Ungültig mit anderen Aufrufflags.

  • InvokeMethod , um eine Methode, aber keinen Konstruktor oder Typinitialisierer aufzurufen. Ungültig mit SetField oder SetProperty. Wenn InvokeMethod selbst angegeben wird, BindingFlags.Publicwerden , BindingFlags.Instanceund BindingFlags.Static automatisch eingeschlossen.

  • GetField , um den Wert eines Felds abzurufen. Ungültig mit SetField.

  • SetField , um den Wert eines Felds festzulegen. Ungültig mit GetField.

  • GetProperty , um eine Eigenschaft abzurufen. Ungültig mit SetProperty.

  • SetProperty , um eine Eigenschaft festzulegen. Ungültig mit GetProperty.

Weitere Informationen finden Sie unter System.Reflection.BindingFlags.

Eine Methode wird aufgerufen, wenn beide der folgenden Bedingungen zutreffen:

  • Die Anzahl der Parameter in der Methodendeklaration entspricht der Anzahl von Argumenten im args Array (es sei denn, Standardargumente werden für den Member definiert und BindingFlags.OptionalParamBinding angegeben).

  • Der Typ der einzelnen Argumente kann vom Binder in den Typ des Parameters konvertiert werden.

Der Binder findet alle übereinstimmenden Methoden. Diese Methoden werden basierend auf dem Typ der angeforderten Bindung gefunden (BindingFlags Werte InvokeMethod, GetPropertyusw.). Der Satz von Methoden wird nach dem Namen, der Anzahl der Argumente und einer Reihe von Suchmodifizierern gefiltert, die im Binder definiert sind.

Nachdem die Methode ausgewählt wurde, wird sie aufgerufen. Die Barrierefreiheit wird an diesem Punkt überprüft. Die Suche kann steuern, welche Methoden basierend auf dem der -Methode zugeordneten Barrierefreiheitsattribut durchsucht werden. Die Binder.BindToMethod -Methode der Binder -Klasse ist für die Auswahl der methode verantwortlich, die aufgerufen werden soll. Der Standardbinder wählt die spezifischste Übereinstimmung aus.

Zugriffsbeschränkungen werden für vollständig vertrauenswürdigen Code ignoriert. Das heißt, private Konstruktoren, Methoden, Felder und Eigenschaften können über aufgerufen und aufgerufen System.Reflection werden, wenn der Code vollständig vertrauenswürdig ist.

Sie können verwenden Type.InvokeMember , um ein Feld auf einen bestimmten Wert festzulegen, indem Sie angeben BindingFlags.SetField. Wenn Sie beispielsweise ein öffentliches instance Feld mit dem Namen F für Klasse C und F ein Stringfestlegen möchten, können Sie Code wie folgt verwenden:

typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {"strings new value"});

Wenn F ein String[]ist, können Sie Code verwenden, z. B.:

typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {new String[]{"a","z","c","d"}});

dadurch wird das Feld F für dieses neue Array initialisiert. Sie können auch verwenden Type.InvokeMember , um eine Position in einem Array festzulegen, indem Sie den Index des Werts und dann den nächsten Wert mithilfe von Code wie dem folgenden angeben:

typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {1, "b"});

Dadurch wird die Zeichenfolge "z" im Array, das F enthält, in die Zeichenfolge "b" geändert.

Wenn Sie einen IDispatch Member aufrufen, können Sie die DispID anstelle des Membernamens mit dem Zeichenfolgenformat "[DispID=##]" angeben. Wenn die DispID von MyComMethod beispielsweise 3 ist, können Sie die Zeichenfolge "[DispID=3]" anstelle von "MyComMethod" angeben. Das Aufrufen eines Members durch DispID ist schneller, als das Element anhand des Namens zu suchen. In komplexen Aggregationsszenarien ist die DispID manchmal die einzige Möglichkeit, das gewünschte Element aufzurufen.

Hinweis

Ab dem .NET Framework 2.0 Service Pack 1 kann diese Methode für den Zugriff auf nicht öffentliche Member verwendet werden, wenn dem Aufrufer das ReflectionPermissionFlag.RestrictedMemberAccess Flag gewährt ReflectionPermission wurde und wenn der Grant-Satz der nicht öffentlichen Member auf den Grant-Satz des Aufrufers oder eine Teilmenge davon beschränkt ist. (Weitere Informationen finden Sie unter Sicherheitsüberlegungen.)

Um diese Funktionalität zu verwenden, sollte Ihre Anwendung auf die .NET Framework 3.5 oder höher abzielen.

Weitere Informationen

Gilt für:

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

Ruft den angegebenen Member auf, der den angegebenen Bindungseinschränkungen sowie der angegebenen Argumentliste und Kultur entspricht.

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

Parameter

name
String

Die Zeichenfolge, die den Namen des Konstruktors, der Methode, der Eigenschaft oder des Feldmembers enthält, der bzw. die aufgerufen werden soll.

- oder -

Eine leere Zeichenfolge ("") zum Aufrufen des Standardmembers.

- oder -

Für IDispatch-Member eine Zeichenfolge, die die DispID darstellt, z. B. "[DispID=3]".

invokeAttr
BindingFlags

Eine bitweise Kombination der Enumerationswerte, die angeben, wie die Suche durchgeführt wird. Der Zugriff kann aus einem der BindingFlags wie Public, NonPublic, Private, InvokeMethod, GetField usw. bestehen. Die Art der Suche muss nicht angegeben werden. Wenn die Art der Suche nicht angegeben ist, werden BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static verwendet.

binder
Binder

Ein Objekt, das eine Gruppe von Eigenschaften definiert und eine Bindung ermöglicht. Dazu kann die Auswahl einer überladenen Methode, die Umwandlung von Argumenttypen und der Aufruf eines Members durch Reflektion gehören.

- oder -

Ein Nullverweis (Nothing in Visual Basic), wenn DefaultBinder verwendet werden soll. Beachten Sie, dass möglicherweise ein Binder-Objekt explizit definiert werden muss, um erfolgreich Methodenüberladungen mit Variablenargumenten aufrufen zu können.

target
Object

Das Objekt, für das der angegebene Member aufgerufen werden soll.

args
Object[]

Ein Array mit den Argumenten, die dem aufzurufenden Member übergeben werden sollen.

culture
CultureInfo

Das Objekt, das das zu verwendende Globalisierungsgebietsschema darstellt, das für gebietsspezifische Konvertierungen wie die Konvertierung einer numerischen String in einen Double erforderlich sein kann.

- oder -

Ein Nullverweis (Nothing in Visual Basic), wenn die CultureInfo des aktuellen Threads verwendet werden soll.

Gibt zurück

Ein Objekt, das den Rückgabewert des aufgerufenen Members darstellt.

Implementiert

Ausnahmen

invokeAttr enthält keine CreateInstance, und name ist null.

invokeAttr ist kein gültiges BindingFlags-Attribut.

- oder -

invokeAttr enthält keines der folgenden Bindungsflags: InvokeMethod, CreateInstance, GetField, SetField, GetProperty oder SetProperty.

- oder -

invokeAttr enthält CreateInstance in Kombination mit InvokeMethod, GetField, SetField, GetProperty oder SetProperty.

- oder -

invokeAttr enthält sowohl GetField als auch SetField.

- oder -

invokeAttr enthält sowohl GetProperty als auch SetProperty.

- oder -

invokeAttr enthält InvokeMethod in Kombination mit SetField oder SetProperty.

- oder -

invokeAttr enthält SetField, und args enthält mehr als ein Element.

- oder -

Diese Methode wird für ein COM-Objekt aufgerufen, und eines der folgenden Bindungsflags wurde nicht übergeben: BindingFlags.InvokeMethod, BindingFlags.GetProperty, BindingFlags.SetProperty, BindingFlags.PutDispProperty oder BindingFlags.PutRefDispProperty.

- oder -

Eines der benannten Parameterarrays enthält eine Zeichenfolge, die null ist.

Der angegebene Member ist ein Klasseninitialisierer.

Das Feld oder die Eigenschaft wurde nicht gefunden.

Es wurde keine Methode gefunden, die den Argumenten in args entspricht.

- oder -

Das aktuelle Type-Objekt stellt einen Typ dar, der offene Typparameter enthält. Das bedeutet, dass ContainsGenericParameters den Wert true zurückgibt.

Der angegebene Member kann nicht für target aufgerufen werden.

Mehrere Methoden entsprechen den Bindungskriterien.

Die durch name dargestellte Methode enthält mindestens einen nicht angegebenen generischen Typparameter. Das bedeutet, dass die ContainsGenericParameters-Eigenschaft der Methode true zurückgibt.

Hinweise

Obwohl der Standardbinder (den culture -Parameter) nicht verarbeitet CultureInfo , können Sie die abstrakte System.Reflection.Binder Klasse verwenden, um einen benutzerdefinierten Binder zu schreiben, der verarbeitetculture.

Hinweis

Sie können keine InvokeMember generische Methode aufrufen.

Die folgenden BindingFlags Filterflags können verwendet werden, um zu definieren, welche Member in die Suche einbezogen werden sollen:

  • Geben Sie an BindingFlags.Public , dass öffentliche Member in die Suche einbezogen werden sollen.

  • Geben Sie an BindingFlags.NonPublic , dass nicht öffentliche Mitglieder (d. h. private, interne und geschützte Member) in die Suche einbezogen werden sollen.

  • Geben Sie an BindingFlags.FlattenHierarchy , um statische Member in die Hierarchie einzuschließen.

Die folgenden BindingFlags Modifiziererflags können verwendet werden, um die Funktionsweise der Suche zu ändern:

  • BindingFlags.IgnoreCase , um den Fall von namezu ignorieren.

  • BindingFlags.DeclaredOnly , um nur die elemente zu durchsuchen, die Typefür deklariert sind, und nicht die Elemente, die einfach geerbt wurden.

Die folgenden BindingFlags Aufrufflags können verwendet werden, um anzugeben, welche Aktion mit dem Member ausgeführt werden soll:

  • CreateInstance , um einen Konstruktor aufzurufen. name wird ignoriert. Ungültig bei anderen Aufrufflags.

  • InvokeMethod , um eine Methode, aber keinen Konstruktor oder Typinitialisierer aufzurufen. Ungültig mit SetField oder SetProperty. Wenn InvokeMethod selbst angegeben wird, BindingFlags.PublicBindingFlags.Instancewerden , und BindingFlags.Static automatisch eingeschlossen.

  • GetField , um den Wert eines Felds abzurufen. Ungültig mit SetField.

  • SetField , um den Wert eines Felds festzulegen. Ungültig mit GetField.

  • GetProperty , um eine Eigenschaft abzurufen. Ungültig mit SetProperty.

  • SetProperty , um eine Eigenschaft festzulegen. Ungültig mit GetProperty.

Weitere Informationen finden Sie unter System.Reflection.BindingFlags.

Eine Methode wird aufgerufen, wenn die beiden folgenden Bedingungen erfüllt sind:

  • Die Anzahl der Parameter in der Methodendeklaration entspricht der Anzahl von Argumenten im args Array (es sei denn, Standardargumente werden für das Element definiert und BindingFlags.OptionalParamBinding werden angegeben).

  • Der Typ der einzelnen Argumente kann vom Binder in den Typ des Parameters konvertiert werden.

Der Binder findet alle übereinstimmenden Methoden. Diese Methoden werden basierend auf dem Typ der angeforderten Bindung gefunden (BindingFlags Werte InvokeMethod, GetPropertyusw.). Der Satz von Methoden wird nach dem Namen, der Anzahl der Argumente und einer Reihe von Suchmodifizierern gefiltert, die im Binder definiert sind.

Nachdem die Methode ausgewählt wurde, wird sie aufgerufen. Die Barrierefreiheit wird an diesem Punkt überprüft. Die Suche kann steuern, welcher Satz von Methoden basierend auf dem der Methode zugeordneten Barrierefreiheitsattribut durchsucht wird. Die Binder.BindToMethod -Methode der Binder -Klasse ist für die Auswahl der methode verantwortlich, die aufgerufen werden soll. Der Standardbinder wählt die spezifischste Übereinstimmung aus.

Zugriffsbeschränkungen werden für vollständig vertrauenswürdigen Code ignoriert. Das heißt, private Konstruktoren, Methoden, Felder und Eigenschaften können über Reflection aufgerufen und aufgerufen werden, wenn der Code vollständig vertrauenswürdig ist.

Sie können verwenden Type.InvokeMember , um ein Feld auf einen bestimmten Wert festzulegen, indem Sie angeben BindingFlags.SetField. Wenn Sie z. B. ein öffentliches instance Feld mit dem Namen F für Klasse C festlegen möchten, und F ein String ist, können Sie Code wie folgendes verwenden:

typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {"strings new value"}, null);

Wenn F ein String[]ist, können Sie Code verwenden, z. B.:

typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {new String[]{"a","z","c","d"}}, null);

initialisiert das Feld F für dieses neue Array. Sie können auch verwenden Type.InvokeMember , um eine Position in einem Array festzulegen, indem Sie den Index des Werts und dann den nächsten Wert mithilfe von Code wie dem folgenden angeben:

typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {1, "b"}, null);

Dadurch wird die Zeichenfolge "z" im Array, das F enthält, in die Zeichenfolge "b" geändert.

Wenn Sie einen IDispatch Member aufrufen, können Sie die DispID anstelle des Membernamens angeben, indem Sie das Zeichenfolgenformat "[DispID=##]" verwenden. Wenn die DispID von MyComMethod beispielsweise 3 ist, können Sie die Zeichenfolge "[DispID=3]" anstelle von "MyComMethod" angeben. Das Aufrufen eines Members durch DispID ist schneller als das Nachschlagen des Members nach Name. In komplexen Aggregationsszenarien ist die DispID manchmal die einzige Möglichkeit, das gewünschte Element aufzurufen.

Hinweis

Ab dem .NET Framework 2.0 Service Pack 1 kann diese Methode für den Zugriff auf nicht öffentliche Member verwendet werden, wenn dem Aufrufer das ReflectionPermissionFlag.RestrictedMemberAccess Flag gewährt ReflectionPermission wurde und wenn der Gewährungssatz der nicht öffentlichen Member auf den Gewährungssatz des Aufrufers oder eine Teilmenge davon beschränkt ist. (Weitere Informationen finden Sie unter Überlegungen zur Sicherheit.)

Um diese Funktionalität zu verwenden, sollte Ihre Anwendung auf die .NET Framework 3.5 oder höher ausgerichtet sein.

Weitere Informationen

Gilt für:

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

Ruft nach Überschreiben in einer abgeleiteten Klasse den angegebenen Member auf, der den angegebenen Bindungseinschränkungen sowie der angegebenen Argumentliste, den Modifizierern und der Kultur entspricht.

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

Parameter

name
String

Die Zeichenfolge, die den Namen des Konstruktors, der Methode, der Eigenschaft oder des Feldmembers enthält, der bzw. die aufgerufen werden soll.

- oder -

Eine leere Zeichenfolge ("") zum Aufrufen des Standardmembers.

- oder -

Für IDispatch-Member eine Zeichenfolge, die die DispID darstellt, z. B. "[DispID=3]".

invokeAttr
BindingFlags

Eine bitweise Kombination der Enumerationswerte, die angeben, wie die Suche durchgeführt wird. Der Zugriff kann aus einem der BindingFlags wie Public, NonPublic, Private, InvokeMethod, GetField usw. bestehen. Die Art der Suche muss nicht angegeben werden. Wenn die Art der Suche nicht angegeben ist, werden BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static verwendet.

binder
Binder

Ein Objekt, das eine Gruppe von Eigenschaften definiert und eine Bindung ermöglicht. Dazu kann die Auswahl einer überladenen Methode, die Umwandlung von Argumenttypen und der Aufruf eines Members durch Reflektion gehören.

- oder -

Ein Nullverweis (Nothing in Visual Basic), wenn DefaultBinder verwendet werden soll. Beachten Sie, dass möglicherweise ein Binder-Objekt explizit definiert werden muss, um erfolgreich Methodenüberladungen mit Variablenargumenten aufrufen zu können.

target
Object

Das Objekt, für das der angegebene Member aufgerufen werden soll.

args
Object[]

Ein Array mit den Argumenten, die dem aufzurufenden Member übergeben werden sollen.

modifiers
ParameterModifier[]

Ein Array von ParameterModifier-Objekten, die die Attribute darstellen, die dem entsprechenden Element im args-Array zugeordnet sind. Die einem Parameter zugeordneten Attribute werden in der Signatur des Members gespeichert.

Der Standardbinder verarbeitet diesen Parameter nur, wenn eine COM-Komponente aufgerufen wird.

culture
CultureInfo

Das CultureInfo-Objekt, das das zu verwendende Globalisierungsgebietsschema darstellt, das für gebietsspezifische Konvertierungen wie die Konvertierung einer numerischen Zeichenfolge in einen Double erforderlich sein kann.

- oder -

Ein Nullverweis (Nothing in Visual Basic), wenn die CultureInfo des aktuellen Threads verwendet werden soll.

namedParameters
String[]

Ein Array mit den Namen der Parameter, an die die Elemente des args-Arrays übergeben werden.

Gibt zurück

Ein Objekt, das den Rückgabewert des aufgerufenen Members darstellt.

Implementiert

Ausnahmen

invokeAttr enthält keine CreateInstance, und name ist null.

args und modifiers weisen nicht die gleiche Länge auf.

- oder -

invokeAttr ist kein gültiges BindingFlags -Attribut.

- oder -

invokeAttr enthält keines der folgenden Bindungsflags: InvokeMethod, CreateInstance, GetField, SetField, GetProperty oder SetProperty.

- oder -

invokeAttr enthält CreateInstance in Kombination mit InvokeMethod, GetField, SetField, GetProperty oder SetProperty.

- oder -

invokeAttr enthält sowohl GetField als auch SetField.

- oder -

invokeAttr enthält sowohl GetProperty als auch SetProperty.

- oder -

invokeAttr enthält InvokeMethod in Kombination mit SetField oder SetProperty.

- oder -

invokeAttr enthält SetField, und args enthält mehr als ein Element.

- oder -

Das benannte Parameterarray ist größer als das Argumentarray.

- oder -

Diese Methode wird für ein COM-Objekt aufgerufen, und eines der folgenden Bindungsflags wurde nicht übergeben: BindingFlags.InvokeMethod, BindingFlags.GetProperty, BindingFlags.SetProperty, BindingFlags.PutDispProperty oder BindingFlags.PutRefDispProperty.

- oder -

Eines der benannten Parameterarrays enthält eine Zeichenfolge, die null ist.

Der angegebene Member ist ein Klasseninitialisierer.

Das Feld oder die Eigenschaft wurde nicht gefunden.

Es wurde keine Methode gefunden, die den Argumenten in args entspricht.

- oder -

Es wurde kein Member gefunden, dessen Argumentnamen in namedParameters angegeben sind.

- oder -

Das aktuelle Type-Objekt stellt einen Typ dar, der offene Typparameter enthält. Das bedeutet, dass ContainsGenericParameters den Wert true zurückgibt.

Der angegebene Member kann nicht für target aufgerufen werden.

Mehrere Methoden entsprechen den Bindungskriterien.

Die durch name dargestellte Methode enthält mindestens einen nicht angegebenen generischen Typparameter. Das bedeutet, dass die ContainsGenericParameters-Eigenschaft der Methode true zurückgibt.

Hinweise

InvokeMember ruft einen Konstruktor- oder Methodenmember auf, ruft ein Eigenschaftselement ab oder legt es fest, ruft einen Datenfeldmember ab oder legt es fest oder ruft ein Element eines Arrayelements ab oder legt es fest.

Hinweis

Sie können nicht verwenden InvokeMember , um eine generische Methode aufzurufen.

Wenn Sie einen IDispatch Member aufrufen, können Sie die DispID anstelle des Membernamens angeben, indem Sie das Zeichenfolgenformat "[DispID=##]" verwenden. Wenn die DispID von MyComMethod beispielsweise 3 ist, können Sie die Zeichenfolge "[DispID=3]" anstelle von "MyComMethod" angeben. Das Aufrufen eines Members durch DispID ist schneller, als das Element anhand des Namens zu suchen. In komplexen Aggregationsszenarien ist die DispID manchmal die einzige Möglichkeit, das gewünschte Element aufzurufen.

Obwohl der Standardbinder oder CultureInfo (die modifiers Parameter und culture ) nicht verarbeitetParameterModifier, können Sie die abstrakte System.Reflection.Binder Klasse verwenden, um einen benutzerdefinierten Binder zu schreiben, der und cultureverarbeitetmodifiers. ParameterModifier wird nur beim Aufrufen über COM-Interop verwendet, und nur Parameter, die als Verweis übergeben werden, werden behandelt.

Jeder Parameter im namedParameters-Array ruft den Wert im entsprechenden Element im args-Array ab. Wenn die Länge von args größer als die Länge von namedParameters ist, werden die restlichen Argumentwerte in der Reihenfolge übergeben.

Das namedParameters Array kann verwendet werden, um die Reihenfolge der Argumente in einem Eingabearray zu ändern. Bei der Methode M(string a, int b) (M(ByVal a As String, ByVal b As Integer) in Visual Basic) und dem Eingabearray { 42, "x" }kann das Eingabearray beispielsweise unverändert an args übergeben werden, wenn das Array { "b", "a" } für namedParametersangegeben wird.

Die folgenden BindingFlags Filterflags können verwendet werden, um zu definieren, welche Member in die Suche einbezogen werden sollen:

  • Geben Sie an BindingFlags.Public , um öffentliche Member in die Suche einzuschließen.

  • Geben Sie an BindingFlags.NonPublic , dass nicht öffentliche Member (d. h. private, interne und geschützte Member) in die Suche einbezogen werden sollen.

  • Geben Sie an BindingFlags.FlattenHierarchy , um statische Member nach oben in die Hierarchie einzuschließen.

Die folgenden BindingFlags Modifiziererflags können verwendet werden, um die Funktionsweise der Suche zu ändern:

  • BindingFlags.IgnoreCase , um den Fall von namezu ignorieren.

  • BindingFlags.DeclaredOnly , um nur die Member zu durchsuchen, die Typefür deklariert sind, und nicht die Elemente, die einfach geerbt wurden.

Die folgenden BindingFlags Aufrufflags können verwendet werden, um anzugeben, welche Aktion mit dem Member ausgeführt werden soll:

  • CreateInstance , um einen Konstruktor aufzurufen. name wird ignoriert. Ungültig mit anderen Aufrufflags.

  • InvokeMethod , um eine Methode, aber keinen Konstruktor oder Typinitialisierer aufzurufen. Ungültig mit SetField oder SetProperty. Wenn InvokeMethod selbst angegeben wird, BindingFlags.Publicwerden , BindingFlags.Instanceund BindingFlags.Static automatisch eingeschlossen.

  • GetField , um den Wert eines Felds abzurufen. Ungültig mit SetField.

  • SetField , um den Wert eines Felds festzulegen. Ungültig mit GetField.

  • GetProperty , um eine Eigenschaft abzurufen. Ungültig mit SetProperty.

  • SetProperty , um eine Eigenschaft festzulegen. Ungültig mit GetProperty.

Weitere Informationen finden Sie unter System.Reflection.BindingFlags.

Eine Methode wird aufgerufen, wenn beide der folgenden Bedingungen zutreffen:

  • Die Anzahl der Parameter in der Methodendeklaration entspricht der Anzahl von Argumenten im args Array (es sei denn, Standardargumente werden für den Member definiert und BindingFlags.OptionalParamBinding angegeben).

  • Der Typ der einzelnen Argumente kann vom Binder in den Typ des Parameters konvertiert werden.

Der Binder findet alle übereinstimmenden Methoden. Diese Methoden werden basierend auf dem Typ der angeforderten Bindung gefunden (BindingFlags Werte InvokeMethod, GetPropertyusw.). Der Satz von Methoden wird nach dem Namen, der Anzahl der Argumente und einer Reihe von Suchmodifizierern gefiltert, die im Binder definiert sind.

Nachdem die Methode ausgewählt wurde, wird sie aufgerufen. Die Barrierefreiheit wird an diesem Punkt überprüft. Die Suche kann steuern, welche Methoden basierend auf dem der -Methode zugeordneten Barrierefreiheitsattribut durchsucht werden. Die Binder.BindToMethod -Methode der Binder -Klasse ist für die Auswahl der methode verantwortlich, die aufgerufen werden soll. Der Standardbinder wählt die spezifischste Übereinstimmung aus.

InvokeMember kann verwendet werden, um Methoden mit Parametern mit Standardwerten aufzurufen. Um eine Bindung an diese Methoden zu erhalten, muss BindingFlags.OptionalParamBinding Reflektion angegeben werden. Für einen Parameter, der über einen Standardwert verfügt, können Sie entweder einen anderen Wert angeben oder den Standardwert angeben Missing.Value .

Betrachten Sie beispielsweise eine Methode wie MyMethod(int x, float y = 2,0). Um diese Methode mit nur dem ersten Argument als MyMethod(4) aufzurufen, übergeben Sie eines der obigen Bindungsflags, und übergeben Sie zwei Argumente, nämlich 4 für das erste Argument und Missing.Value für das zweite Argument. Wenn Sie nicht verwenden Missing.Value, dürfen Sie optionale Parameter bei der Invoke -Methode nicht weglassen. Wenn Sie dies tun müssen, verwenden Sie InvokeMember stattdessen.

Zugriffsbeschränkungen werden für vollständig vertrauenswürdigen Code ignoriert. Das heißt, private Konstruktoren, Methoden, Felder und Eigenschaften können über aufgerufen und aufgerufen System.Reflection werden, wenn der Code vollständig vertrauenswürdig ist.

Sie können verwenden Type.InvokeMember , um ein Feld auf einen bestimmten Wert festzulegen, indem Sie angeben BindingFlags.SetField. Wenn Sie beispielsweise ein öffentliches instance Feld mit dem Namen F für Klasse C und F ein Stringfestlegen möchten, können Sie Code wie folgt verwenden:

typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {"strings new value"}, null, null, null);

Wenn F ein String[]ist, können Sie Code verwenden, z. B.:

typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {new String[]{"a","z","c","d"}}, null, null, null);

dadurch wird das Feld F für dieses neue Array initialisiert. Sie können auch verwenden Type.InvokeMember , um eine Position in einem Array festzulegen, indem Sie den Index des Werts und dann den nächsten Wert mithilfe von Code wie dem folgenden angeben:

typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {1, "b"}, null, null, null);

Dadurch wird die Zeichenfolge "z" im Array, das F enthält, in die Zeichenfolge "b" geändert.

Hinweis

Ab dem .NET Framework 2.0 Service Pack 1 kann diese Methode für den Zugriff auf nicht öffentliche Member verwendet werden, wenn dem Aufrufer das ReflectionPermissionFlag.RestrictedMemberAccess Flag gewährt ReflectionPermission wurde und wenn der Gewährungssatz der nicht öffentlichen Member auf den Gewährungssatz des Aufrufers oder eine Teilmenge davon beschränkt ist. (Weitere Informationen finden Sie unter Überlegungen zur Sicherheit.)

Um diese Funktionalität zu verwenden, sollte Ihre Anwendung auf die .NET Framework 3.5 oder höher ausgerichtet sein.

Weitere Informationen

Gilt für: