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[]) |
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[])
- Quelle:
- Type.cs
- Quelle:
- Type.cs
- Quelle:
- Type.cs
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 vonname
zu 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 mitSetField
oderSetProperty
. WennInvokeMethod
selbst angegeben wird,BindingFlags.Public
werden ,BindingFlags.Instance
undBindingFlags.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
, um eine Eigenschaft festzulegen. Ungültig mitGetProperty
.
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 undBindingFlags.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
, GetProperty
usw.). 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 String
festlegen 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
- String
- Binder
- DefaultBinder
- BindingFlags
- ParameterModifier
- ParameterAttributes
- CultureInfo
- ReflectionPermission
Gilt für:
InvokeMember(String, BindingFlags, Binder, Object, Object[], CultureInfo)
- Quelle:
- Type.cs
- Quelle:
- Type.cs
- Quelle:
- Type.cs
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 vonname
zu 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 mitSetField
oderSetProperty
. WennInvokeMethod
selbst angegeben wird,BindingFlags.Public
BindingFlags.Instance
werden , undBindingFlags.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
, um eine Eigenschaft festzulegen. Ungültig mitGetProperty
.
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 undBindingFlags.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
, GetProperty
usw.). 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
- String
- Binder
- DefaultBinder
- BindingFlags
- ParameterModifier
- ParameterAttributes
- CultureInfo
- ReflectionPermission
Gilt für:
InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[])
- Quelle:
- Type.cs
- Quelle:
- Type.cs
- Quelle:
- Type.cs
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 culture
verarbeitetmodifiers
.
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 namedParameters
angegeben 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 vonname
zu 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 mitSetField
oderSetProperty
. WennInvokeMethod
selbst angegeben wird,BindingFlags.Public
werden ,BindingFlags.Instance
undBindingFlags.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
, um eine Eigenschaft festzulegen. Ungültig mitGetProperty
.
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 undBindingFlags.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
, GetProperty
usw.). 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 String
festlegen 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
- String
- Binder
- DefaultBinder
- BindingFlags
- ParameterModifier
- ParameterAttributes
- CultureInfo
- ReflectionPermission