Type.InvokeMember Methode
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Ruft einen bestimmten Member vom aktuellen Type auf.
Überlädt
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[], CultureInfo) |
Ruft den angegebenen Member auf, der den angegebenen Bindungseinschränkungen sowie der angegebenen Argumentliste und Kultur entspricht. |
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[], 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ältSetField
, undargs
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 ein Konstruktorelement oder ein Methodenelement ab, ruft ein Eigenschaftselement ab, ruft ein Datenfeldelement ab oder legt ein Element eines Arrayelements ab oder legt dieses fest.
Hinweis
Sie können keine InvokeMember generische Methode aufrufen.
Wenn Sie ein IDispatch
Element aufrufen, können Sie die DispID anstelle des Membernamens mithilfe des Zeichenfolgenformats "[DispID=##]" angeben. Wenn beispielsweise die DispID von MyComMethod 3 ist, können Sie die Zeichenfolge "[DispID=3]" anstelle von "MyComMethod" angeben. Das Aufrufen eines Mitglieds durch DispID ist schneller als das Nachschlagen des Mitglieds nach Namen. In komplexen Aggregationsszenarien ist die DispID manchmal die einzige Möglichkeit, das gewünschte Element aufzurufen.
Obwohl der Standardbinder nicht verarbeitet ParameterModifier wird oder CultureInfo (die und culture
die modifiers
Parameter), können Sie die abstrakte System.Reflection.Binder Klasse verwenden, um einen benutzerdefinierten Ordner zu schreiben, der verarbeitet und verarbeitet modifiers
wirdculture
. ParameterModifier
wird nur beim Aufrufen durch COM-Interop verwendet, und nur Parameter, die durch 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 kann das Eingabearray { 42, "x" }
beispielsweise unverändert args
übergeben werden, wenn das Array { "b", "a" }
bereitgestellt namedParameters
wird.
Die folgenden BindingFlags Filterkennzeichnungen können verwendet werden, um zu definieren, welche Member in die Suche einbezogen werden sollen:
Geben Sie
BindingFlags.Public
an, öffentliche Mitglieder in die Suche einzuschließen.Geben Sie
BindingFlags.NonPublic
an, dass nicht öffentliche Mitglieder (also private, interne und geschützte Mitglieder) in die Suche einbezogen werden sollen.Geben Sie
BindingFlags.FlattenHierarchy
an, statische Elemente in die Hierarchie einzuschließen.
Die folgenden BindingFlags Modifiziererkennzeichnungen können verwendet werden, um die Funktionsweise der Suche zu ändern:
BindingFlags.IgnoreCase
um den Fall vonname
.BindingFlags.DeclaredOnly
um nur die Mitglieder zu durchsuchen, die für die TypeMitglieder deklariert wurden , nicht mitglieder, die einfach geerbt wurden.
Die folgenden BindingFlags Aufrufflaggen können verwendet werden, um zu kennzeichnen, welche Aktion mit dem Mitglied ausgeführt werden soll:
CreateInstance
um einen Konstruktor aufzurufen.name
wird ignoriert. Ungültig bei anderen Aufrufkennzeichnungen.InvokeMethod
zum Aufrufen einer Methode, aber nicht eines Konstruktors oder eines Typinitializers. Ungültig mitSetField
oderSetProperty
. WennInvokeMethod
sie selbst angegeben wird,BindingFlags.Public``BindingFlags.Instance
werden sieBindingFlags.Static
automatisch eingeschlossen.GetField
um den Wert eines Felds abzurufen. Ungültig mitSetField
.SetField
um den Wert eines Felds festzulegen. Ungültig mitGetField
.GetProperty
um eine Eigenschaft abzurufen. Ungültig mitSetProperty
.SetProperty
so legen Sie eine Eigenschaft fest. Ungültig mitGetProperty
.
Weitere Informationen finden Sie unter System.Reflection.BindingFlags.
Eine Methode wird aufgerufen, wenn beide der folgenden Bedingungen wahr sind:
Die Anzahl der Parameter in der Methodendeklaration entspricht der Anzahl der Argumente im
args
Array (es sei denn, Standardargumente werden für das Element definiert undBindingFlags.OptionalParamBinding
angegeben).Der Typ der einzelnen Argumente kann durch den Ordner in den Typ des Parameters konvertiert werden.
Der Binder findet alle passenden Methoden. Diese Methoden werden basierend auf dem Typ der angeforderten Bindung (BindingFlags Werte InvokeMethod
, GetProperty
usw.) gefunden. Der Satz von Methoden wird nach dem Namen, der Anzahl der Argumente und einer Reihe von Suchmodifizierern gefiltert, die in dem Ordner definiert sind.
Nachdem die Methode ausgewählt wurde, wird sie aufgerufen. Die Barrierefreiheit wird an diesem Punkt überprüft. Die Suche kann steuern, welche Methodensätze basierend auf dem Barrierefreiheitsattribute, das der Methode zugeordnet ist, durchsucht werden. Die Binder.BindToMethod Methode der Binder Klasse ist dafür verantwortlich, die aufgerufene Methode auszuwählen. Der Standardbinder wählt die spezifischste Übereinstimmung aus.
InvokeMember
kann verwendet werden, um Methoden mit Parametern mit Standardwerten aufzurufen. Um an diese Methoden zu binden, muss BindingFlags.OptionalParamBinding reflection angegeben werden. Für einen Parameter mit einem Standardwert können Sie entweder einen anderen Wert angeben oder Missing.Value den Standardwert verwenden.
Ziehen Sie beispielsweise eine Methode wie MyMethod(int x, float y = 2.0) in Betracht. Wenn Sie diese Methode nur mit dem ersten Argument als MyMethod(4) aufrufen möchten, übergeben Sie eines der obigen Bindungskennzeichnungen und übergeben Sie zwei Argumente, nämlich 4 für das erste Argument und Missing.Value
für das zweite Argument. Es sei denn, Sie verwenden Missing.Value
, sie dürfen keine optionalen Parameter mit der Invoke
Methode weglassen. Verwenden Sie InvokeMember
stattdessen, wenn Sie dies tun müssen.
Zugriffsbeschränkungen werden für vollständig vertrauenswürdigen Code ignoriert; das heißt, auf private Konstruktoren, Methoden, Felder und Eigenschaften kann zugegriffen 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 z. B. ein öffentliches Instanzfeld mit dem Namen F für Klasse C festlegen möchten, und F ist ein String
, können Sie Code wie:
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. Folgendes:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {new String[]{"a","z","c","d"}}, null, null, null);
das Feld F für dieses neue Array initialisiert. Sie können auch Type.InvokeMember
eine Position in einem Array festlegen, indem Sie den Index des Werts und dann den nächsten Wert mithilfe von Code wie folgenden angeben:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {1, "b"}, null, null, null);
Dadurch wird die Zeichenfolge "z" im Array geändert, das F in der Zeichenfolge "b" enthält.
Hinweis
Ab dem .NET Framework 2.0 Service Pack 1 kann diese Methode verwendet werden, um auf nicht öffentliche Mitglieder zuzugreifen, wenn der Aufrufer mit dem ReflectionPermissionFlag.RestrictedMemberAccess Flag erteilt ReflectionPermission wurde und wenn der Grantsatz der nicht öffentlichen Mitglieder auf den Erteilungssatz des Aufrufers oder eine Teilmenge davon beschränkt ist. (Siehe Sicherheitsüberlegungen zur Reflexion.)
Um diese Funktionalität zu verwenden, sollte Ihre Anwendung auf die .NET Framework 3.5 oder höher ausgerichtet sein.
Siehe auch
- String
- Binder
- DefaultBinder
- BindingFlags
- ParameterModifier
- ParameterAttributes
- CultureInfo
- ReflectionPermission
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ältSetField
, undargs
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 Standardordner nicht verarbeitet CultureInfo wird (der culture
Parameter), können Sie die abstrakte System.Reflection.Binder Klasse verwenden, um einen benutzerdefinierten Ordner zu schreiben, der verarbeitet wird culture
.
Hinweis
Sie können keine InvokeMember generische Methode aufrufen.
Die folgenden BindingFlags Filterkennzeichnungen können verwendet werden, um zu definieren, welche Member in die Suche einbezogen werden sollen:
Geben Sie
BindingFlags.Public
an, öffentliche Mitglieder in die Suche einzuschließen.Geben Sie
BindingFlags.NonPublic
an, dass nicht öffentliche Mitglieder (also private, interne und geschützte Mitglieder) in die Suche einbezogen werden sollen.Geben Sie
BindingFlags.FlattenHierarchy
an, statische Elemente in die Hierarchie einzuschließen.
Die folgenden BindingFlags Modifiziererkennzeichnungen können verwendet werden, um die Funktionsweise der Suche zu ändern:
BindingFlags.IgnoreCase
um den Fall vonname
.BindingFlags.DeclaredOnly
um nur die Mitglieder zu durchsuchen, die für die TypeMitglieder deklariert wurden , nicht mitglieder, die einfach geerbt wurden.
Die folgenden BindingFlags Aufrufflaggen können verwendet werden, um zu kennzeichnen, welche Aktion mit dem Mitglied ausgeführt werden soll:
CreateInstance
um einen Konstruktor aufzurufen.name
wird ignoriert. Ungültig bei anderen Aufrufkennzeichnungen.InvokeMethod
zum Aufrufen einer Methode, aber nicht eines Konstruktors oder eines Typinitializers. Ungültig mitSetField
oderSetProperty
. WennInvokeMethod
sie selbst angegeben wird,BindingFlags.Public``BindingFlags.Instance
werden sieBindingFlags.Static
automatisch eingeschlossen.GetField
um den Wert eines Felds abzurufen. Ungültig mitSetField
.SetField
um den Wert eines Felds festzulegen. Ungültig mitGetField
.GetProperty
um eine Eigenschaft abzurufen. Ungültig mitSetProperty
.SetProperty
so legen Sie eine Eigenschaft fest. Ungültig mitGetProperty
.
Weitere Informationen finden Sie unter System.Reflection.BindingFlags.
Eine Methode wird aufgerufen, wenn beide der folgenden Bedingungen wahr sind:
Die Anzahl der Parameter in der Methodendeklaration entspricht der Anzahl der Argumente im
args
Array (es sei denn, Standardargumente werden für das Element definiert undBindingFlags.OptionalParamBinding
angegeben).Der Typ der einzelnen Argumente kann durch den Ordner in den Typ des Parameters konvertiert werden.
Der Binder findet alle passenden Methoden. Diese Methoden werden basierend auf dem Typ der angeforderten Bindung (BindingFlags Werte InvokeMethod
, GetProperty
usw.) gefunden. Der Satz von Methoden wird nach dem Namen, der Anzahl der Argumente und einer Reihe von Suchmodifizierern gefiltert, die in dem Ordner definiert sind.
Nachdem die Methode ausgewählt wurde, wird sie aufgerufen. Die Barrierefreiheit wird an diesem Punkt überprüft. Die Suche kann steuern, welche Methodensätze basierend auf dem Barrierefreiheitsattribute, das der Methode zugeordnet ist, durchsucht werden. Die Binder.BindToMethod Methode der Binder Klasse ist dafür verantwortlich, die aufgerufene Methode auszuwählen. 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 Instanzfeld mit dem Namen F für Klasse C festlegen möchten, und F ist ein String
Code wie:
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. Folgendes:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {new String[]{"a","z","c","d"}}, null);
das Feld F für dieses neue Array initialisiert. Sie können auch Type.InvokeMember
eine Position in einem Array festlegen, indem Sie den Index des Werts und dann den nächsten Wert mithilfe von Code wie folgenden angeben:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {1, "b"}, null);
Dadurch wird die Zeichenfolge "z" im Array geändert, das F in der Zeichenfolge "b" enthält.
Wenn Sie ein IDispatch
Element aufrufen, können Sie die DispID anstelle des Membernamens mithilfe des Zeichenfolgenformats "[DispID=##]" angeben. Wenn beispielsweise die DispID von MyComMethod 3 ist, können Sie die Zeichenfolge "[DispID=3]" anstelle von "MyComMethod" angeben. Das Aufrufen eines Mitglieds durch DispID ist schneller als das Nachschlagen des Mitglieds nach Namen. 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 verwendet werden, um auf nicht öffentliche Mitglieder zuzugreifen, wenn der Aufrufer mit dem ReflectionPermissionFlag.RestrictedMemberAccess Flag erteilt ReflectionPermission wurde und wenn der Grantsatz der nicht öffentlichen Mitglieder auf den Erteilungssatz des Aufrufers oder eine Teilmenge davon beschränkt ist. (Siehe Sicherheitsüberlegungen zur Reflexion.)
Um diese Funktionalität zu verwenden, sollte Ihre Anwendung auf die .NET Framework 3.5 oder höher ausgerichtet sein.
Siehe auch
- String
- Binder
- DefaultBinder
- BindingFlags
- ParameterModifier
- ParameterAttributes
- CultureInfo
- ReflectionPermission
Gilt für:
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ältSetField
, undargs
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 der Zugriff auf Elemente eines Typs verwendet 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
Hinweise
Hinweis
Sie können InvokeMember keine generische Methode aufrufen.
Die folgenden BindingFlags Filter-Flags können verwendet werden, um zu definieren, welche Elemente in die Suche einbezogen werden sollen:
Geben Sie an
BindingFlags.Public
, öffentliche Mitglieder in die Suche einzuschließen.Geben Sie an
BindingFlags.NonPublic
, nicht öffentliche Mitglieder (also private und geschützte Mitglieder) in die Suche einzuschließen.Geben Sie an
BindingFlags.FlattenHierarchy
, statische Elemente in die Hierarchie einzuschließen.
Die folgenden BindingFlags Modifizierer-Flags können verwendet werden, um zu ändern, wie die Suche funktioniert:
BindingFlags.IgnoreCase
so ignorieren Sie den Fall vonname
.BindingFlags.DeclaredOnly
um nur die mitglieder zu durchsuchen, die auf der Type, nicht mitglieder, die einfach geerbt wurden.
Die folgenden BindingFlags Aufrufzeichen können verwendet werden, um zu kennzeichnen, welche Aktion mit dem Member ausgeführt werden soll:
CreateInstance
um einen Konstruktor aufzurufen.name
wird ignoriert. Nicht gültig mit anderen Aufrufzeichen.InvokeMethod
zum Aufrufen einer Methode, aber nicht eines Konstruktors oder eines Typ-Initializers. Ungültig mitSetField
oderSetProperty
. WennInvokeMethod
sie selbst angegeben wird,BindingFlags.Public``BindingFlags.Instance``BindingFlags.Static
werden sie automatisch eingeschlossen.GetField
um den Wert eines Felds abzurufen. Ungültig mitSetField
.SetField
um den Wert eines Felds festzulegen. Ungültig mitGetField
.GetProperty
um eine Eigenschaft abzurufen. Ungültig mitSetProperty
.SetProperty
so legen Sie eine Eigenschaft fest. Ungültig mitGetProperty
.
Weitere Informationen finden Sie unter System.Reflection.BindingFlags.
Eine Methode wird aufgerufen, wenn beide der folgenden Bedingungen wahr sind:
Die Anzahl der Parameter in der Methodendeklaration entspricht der Anzahl der Argumente im Array (es sei denn, Standardargumente werden auf dem
args
Element definiert undBindingFlags.OptionalParamBinding
angegeben).Der Typ jedes Arguments kann durch den Ordner in den Typ des Parameters konvertiert werden.
Der Binder findet alle übereinstimmenden Methoden. Diese Methoden werden basierend auf dem Typ der angefordertenBindingFlags Bindung ( Werte InvokeMethod
, GetProperty
usw.) gefunden. Der Satz von Methoden wird nach dem Namen, der Anzahl der Argumente und einer Reihe von Suchmodifizierern gefiltert, die im Ordner definiert sind.
Nachdem die Methode ausgewählt wurde, wird sie aufgerufen. Die Barrierefreiheit wird an diesem Punkt überprüft. Die Suche kann steuern, welche Gruppe von Methoden basierend auf dem Barrierefreiheitsattribute, das der Methode zugeordnet ist, durchsucht werden. Die Binder.BindToMethod Methode der Binder Klasse ist dafür verantwortlich, die aufgerufene Methode auszuwählen. Der Standardbinder wählt die spezifischste Übereinstimmung aus.
Zugriffsbeschränkungen werden für voll vertrauenswürdigen Code ignoriert; das heißt, private Konstruktoren, Methoden, Felder und Eigenschaften können zugegriffen 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 z. B. ein öffentliches Instanzfeld mit dem Namen F auf Klasse C festlegen möchten, und F ist ein String
, können Sie Code wie z. B. Folgendes verwenden:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {"strings new value"});
Wenn F ein String[]
ist, können Sie Code wie z. B. Folgendes verwenden:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {new String[]{"a","z","c","d"}});
das Feld F für dieses neue Array initialisiert. Sie können auch Type.InvokeMember
eine Position in einem Array festlegen, indem Sie den Index des Werts und dann den nächsten Wert mithilfe von Code wie den folgenden angeben:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {1, "b"});
Dadurch wird die Zeichenfolge "z" im Array geändert, das F an die Zeichenfolge "b" hält.
Wenn Sie ein IDispatch
Element aufrufen, können Sie die DispID anstelle des Membernamens angeben, indem Sie das Zeichenfolgenformat "[DispID=##]" verwenden. Wenn beispielsweise die DispID von MyComMethod 3 ist, können Sie die Zeichenfolge "[DispID=3]" anstelle von "MyComMethod" angeben. Das Aufrufen eines Elements durch DispID ist schneller als das Nachschlagen des Elements nach Dem Namen. 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 verwendet werden, um auf nicht öffentliche Mitglieder zuzugreifen, wenn der Anrufer mit dem ReflectionPermissionFlag.RestrictedMemberAccess Flag gewährt wurde und wenn der Grantsatz der nicht öffentlichen Mitglieder auf den Grantsatz des Anrufers oder eine Teilmenge davon beschränkt istReflectionPermission. (Siehe Sicherheitsüberlegungen für Spiegelung.)
Um diese Funktionalität zu verwenden, sollte Ihre Anwendung auf die .NET Framework 3.5 oder höher abzielen.
Siehe auch
- String
- Binder
- DefaultBinder
- BindingFlags
- ParameterModifier
- ParameterAttributes
- CultureInfo
- ReflectionPermission