Type.InvokeMember Metódus
Definíció
Fontos
Egyes információk olyan, kiadás előtti termékekre vonatkoznak, amelyek a kiadásig még jelentősen módosulhatnak. A Microsoft nem vállal kifejezett vagy törvényi garanciát az itt megjelenő információért.
Meghívja az aktuális Typetagot.
Túlterhelések
| Name | Description |
|---|---|
| InvokeMember(String, BindingFlags, Binder, Object, Object[]) |
Meghívja a megadott tagot a megadott kötési korlátozások használatával, és megfelel a megadott argumentumlistának. |
| InvokeMember(String, BindingFlags, Binder, Object, Object[], CultureInfo) |
Meghívja a megadott tagot a megadott kötési korlátozások használatával, és megfelel a megadott argumentumlistának és -kultúrának. |
| InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[]) |
Ha egy származtatott osztályban felül van bírálva, meghívja a megadott tagot a megadott kötési korlátozások használatával, és megfelel a megadott argumentumlistának, módosítóknak és kultúrának. |
InvokeMember(String, BindingFlags, Binder, Object, Object[])
- Forrás:
- Type.cs
- Forrás:
- Type.cs
- Forrás:
- Type.cs
- Forrás:
- Type.cs
- Forrás:
- Type.cs
Meghívja a megadott tagot a megadott kötési korlátozások használatával, és megfelel a megadott argumentumlistának.
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);
[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicProperties | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicProperties)]
public object? InvokeMember(string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder? binder, object? target, object?[]? args);
[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.All)]
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);
public object? InvokeMember(string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder? binder, object? target, object?[]? args);
[<System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicProperties | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicProperties)>]
member this.InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] -> obj
[<System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.All)>]
member this.InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] -> obj
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
Paraméterek
- name
- String
A meghívandó konstruktor, metódus, tulajdonság vagy mezőtag nevét tartalmazó sztring.
-vagy-
Egy üres sztring ("") az alapértelmezett tag meghívásához.
-vagy-
Tagok esetén IDispatch a DispID-t képviselő sztring, például "[DispID=3]".
- invokeAttr
- BindingFlags
A számbavételi értékek bitenkénti kombinációja, amely meghatározza a keresés menetét. A hozzáférés lehet például a BindingFlags , Public, , NonPublicPrivate, InvokeMethodstb.GetField A keresés típusát nem kell megadni. Ha a keresés típusa nincs megadva, BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static akkor a rendszer használja.
- binder
- Binder
Olyan objektum, amely tulajdonságokat határoz meg, és engedélyezi a kötést, amely magában foglalhatja egy túlterhelt metódus kiválasztását, az argumentumtípusok kényszerítését és a tag meghívását a tükröződésen keresztül.
-vagy-
Nullhivatkozás (Nothing Visual Basic) a DefaultBinder használatához. Vegye figyelembe, hogy az objektum explicit definiálása Binder szükséges lehet a metódusok változóargumentumokkal való sikeres meghívásához.
- target
- Object
Az az objektum, amelyen a megadott tagot meg kell hívni.
- args
- Object[]
Egy tömb, amely a meghívandó tagnak átadni kívánt argumentumokat tartalmazza.
Válaszok
A meghívott tag visszatérési értékét képviselő objektum.
Megvalósítás
- Attribútumok
Kivételek
invokeAttrnem tartalmazza és CreateInstance nem is tartalmazzaname.null
invokeAttr érvénytelen BindingFlags attribútum.
-vagy-
invokeAttr nem tartalmazza a következő kötésjelölők egyikét: InvokeMethod, CreateInstance, GetField, SetField, GetPropertyvagy SetProperty.
-vagy-
invokeAttra , CreateInstance , InvokeMethodGetField, SetFieldvagy GetProperty.SetProperty
-vagy-
invokeAttr mindkettőt GetField és SetField.
-vagy-
invokeAttr mindkettőt GetProperty és SetProperty.
-vagy-
invokeAttra (vagy InvokeMethoda) kombinációt SetField tartalmazzaSetProperty.
-vagy-
invokeAttr több elemet tartalmaz SetField és args tartalmaz.
-vagy-
Ez a metódus egy COM-objektumon van meghívva, és a következő kötésjelölők egyike nem lett átadva: BindingFlags.InvokeMethod, BindingFlags.GetProperty, BindingFlags.SetProperty, BindingFlags.PutDispPropertyvagy BindingFlags.PutRefDispProperty.
-vagy-
Az egyik elnevezett paramétertömb tartalmaz egy sztringet, amely az null.
A megadott tag egy osztály inicializálója.
A mező vagy tulajdonság nem található.
Nem található olyan metódus, amely megegyezik a következő argumentumokkal args: .
-vagy-
Az aktuális Type objektum egy olyan típust jelöl, amely nyitott típusparamétereket tartalmaz, ContainsGenericParameters azaz visszaadja a függvényt true.
A megadott tag nem hívható meg a következőn target: .
Egynél több metódus felel meg a kötési feltételeknek.
A .NET Compact Framework jelenleg nem támogatja ezt a módszert.
Az általuk name képviselt metódus egy vagy több meghatározatlan általános típusparamétert tartalmaz. Ez azt jelzi, hogy a metódus tulajdonsága ContainsGenericParameters ad vissza true.
Példák
Az alábbi példa egy típus tagjaihoz való hozzáférést használja InvokeMember .
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
Megjegyzések
Note
Nem hívhat InvokeMember meg általános metódust.
A következő BindingFlags szűrőjelölőkkel határozhatja meg, hogy mely tagok szerepeljenek a keresésben:
Adja meg
BindingFlags.Public, hogy a nyilvános tagok szerepeljenek a keresésben.Adja meg
BindingFlags.NonPublic, hogy a nem nyilvános tagok (azaz a privát és védett tagok) szerepeljenek a keresésben.Adja meg
BindingFlags.FlattenHierarchy, hogy statikus tagokat is belefoglaljon a hierarchiába.
A keresés működésének módosításához az alábbi BindingFlags módosító jelzők használhatók:
BindingFlags.IgnoreCasea eset figyelmen kívül hagyásáhozname.BindingFlags.DeclaredOnlycsak a deklarált Typetagok keresésére, nem pedig az egyszerűen öröklött tagokra.
A következő BindingFlags meghívási jelölőkkel jelezheti, hogy milyen műveletet kell elvégeznie a taggal:
CreateInstancekonstruktor meghívásához. Anamefigyelmen kívül van hagyva. Érvénytelen más meghívási jelzőkkel.InvokeMethodmetódus meghívásához, konstruktor vagy típus inicializáló nem. Érvénytelen a vagySetFieldaSetProperty. HaInvokeMethodönmagában van megadva,BindingFlags.PublicakkorBindingFlags.InstanceBindingFlags.Statica rendszer automatikusan belefoglalja.GetFieldmező értékének lekéréséhez. Érvénytelen aSetField.SetFieldmező értékének beállításához. Érvénytelen aGetField.GetPropertytulajdonság lekéréséhez. Érvénytelen aSetProperty.SetPropertytulajdonság beállításához. Érvénytelen aGetProperty.
További információért lásd a System.Reflection.BindingFlags jelű részt.
A rendszer meghív egy metódust, ha az alábbi feltételek mindegyike teljesül:
A metódusdeklarációban szereplő paraméterek száma megegyezik a tömb argumentumainak
argsszámával (kivéve, ha az alapértelmezett argumentumok a tagon vannak definiálva, ésBindingFlags.OptionalParamBindingmeg vannak adva).Az egyes argumentumok típusát a kötőanyag a paraméter típusára konvertálhatja.
A kötőanyag megtalálja az összes megfelelő metódust. Ezek a metódusok a kért kötés típusa (BindingFlags értékek InvokeMethodstb GetProperty.) alapján találhatók. A metódusok halmazát a kötőanyagban definiált név, argumentumok száma és keresési módosítók halmaza szűri.
A metódus kiválasztása után a metódus meg lesz hívva. Az akadálymentesség ekkor be van jelölve. A keresés szabályozhatja, hogy a metódushoz társított akadálymentességi attribútum alapján mely metódusok kereshetők. Az Binder.BindToMethod osztály metódusa Binder felel a meghívandó metódus kiválasztásáért. Az alapértelmezett kötés a legspecifikusabb egyezést választja ki.
A hozzáférési korlátozások figyelmen kívül lesznek hagyva a teljes mértékben megbízható kód esetében; vagyis a magánkonstruktorok, metódusok, mezők és tulajdonságok akkor érhetők el és hívhatók meg System.Reflection , ha a kód teljes mértékben megbízható.
A mezőket egy adott értékre állíthatja Type.InvokeMember be a megadott érték megadásával BindingFlags.SetField. Ha például egy F nevű nyilvános példánymezőt szeretne beállítani a C osztályban, és az F egy String, akkor a következő kódot használhatja:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {"strings new value"});
Ha az F egy String[], a következő kódokat használhatja:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {new String[]{"a","z","c","d"}});
amely inicializálja az F mezőt az új tömbbe. A tömbök pozícióját úgy is Type.InvokeMember beállíthatja, hogy megadja az érték indexét, majd a következő értéket az alábbi kóddal:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {1, "b"});
Ez megváltoztatja a "z" sztringet abban a tömbben, amelyet az F tart a "b" sztringre.
Amikor meghív egy tagot IDispatch , a tag neve helyett a DispID azonosítót is megadhatja a(z) "[DispID=##]" sztringformátummal. Ha például a MyComMethod dispID azonosítója 3, a "MyComMethod" helyett a "[DispID=3]" sztringet adhatja meg. A tag meghívása a DispID alapján gyorsabb, mint a tag név szerinti keresése. Összetett összesítési forgatókönyvekben néha a DispID az egyetlen módja a kívánt tag meghívásának.
Note
Ez a módszer akkor használható a nem nyilvános tagok elérésére, ha a hívó a jelölővel ReflectionPermission rendelkezikReflectionPermissionFlag.RestrictedMemberAccess, és ha a nem nyilvános tagok támogatási készlete a hívó támogatási csoportjára vagy annak egy részhalmazára korlátozódik. (Lásd a tükröződés biztonsági szempontjait.)
A funkció használatához az alkalmazásnak .NET Framework 3.5-ös vagy újabb verziójára kell irányulnia.
Lásd még
- String
- Binder
- DefaultBinder
- BindingFlags
- ParameterModifier
- ParameterAttributes
- CultureInfo
- ReflectionPermission
A következőre érvényes:
InvokeMember(String, BindingFlags, Binder, Object, Object[], CultureInfo)
- Forrás:
- Type.cs
- Forrás:
- Type.cs
- Forrás:
- Type.cs
- Forrás:
- Type.cs
- Forrás:
- Type.cs
Meghívja a megadott tagot a megadott kötési korlátozások használatával, és megfelel a megadott argumentumlistának és -kultúrának.
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);
[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicProperties | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicProperties)]
public object? InvokeMember(string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder? binder, object? target, object?[]? args, System.Globalization.CultureInfo? culture);
[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.All)]
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);
public object? InvokeMember(string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder? binder, object? target, object?[]? args, System.Globalization.CultureInfo? culture);
[<System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicProperties | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicProperties)>]
member this.InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] * System.Globalization.CultureInfo -> obj
[<System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.All)>]
member this.InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] * System.Globalization.CultureInfo -> obj
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
Paraméterek
- name
- String
A meghívandó konstruktor, metódus, tulajdonság vagy mezőtag nevét tartalmazó sztring.
-vagy-
Egy üres sztring ("") az alapértelmezett tag meghívásához.
-vagy-
Tagok esetén IDispatch a DispID-t képviselő sztring, például "[DispID=3]".
- invokeAttr
- BindingFlags
A számbavételi értékek bitenkénti kombinációja, amely meghatározza a keresés menetét. A hozzáférés lehet például a BindingFlags , Public, , NonPublicPrivate, InvokeMethodstb.GetField A keresés típusát nem kell megadni. Ha a keresés típusa nincs megadva, BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static akkor a rendszer használja.
- binder
- Binder
Olyan objektum, amely tulajdonságokat határoz meg, és engedélyezi a kötést, amely magában foglalhatja egy túlterhelt metódus kiválasztását, az argumentumtípusok kényszerítését és a tag meghívását a tükröződésen keresztül.
-vagy-
Nullhivatkozás (Nothing Visual Basic) a DefaultBinder használatához. Vegye figyelembe, hogy az objektum explicit definiálása Binder szükséges lehet a metódusok változóargumentumokkal való sikeres meghívásához.
- target
- Object
Az az objektum, amelyen a megadott tagot meg kell hívni.
- args
- Object[]
Egy tömb, amely a meghívandó tagnak átadni kívánt argumentumokat tartalmazza.
- culture
- CultureInfo
A használandó globalizálási területi beállításokat képviselő objektum, amely a területi beállításokra vonatkozó átalakításokhoz, például számmá StringDoublealakításához szükséges lehet.
-vagy-
Nullhivatkozás (Nothing Visual Basic) az aktuális szál CultureInfo használatára.
Válaszok
A meghívott tag visszatérési értékét képviselő objektum.
Megvalósítás
- Attribútumok
Kivételek
invokeAttrnem tartalmazza és CreateInstance nem is tartalmazzaname.null
invokeAttr érvénytelen BindingFlags attribútum.
-vagy-
invokeAttr nem tartalmazza a következő kötésjelölők egyikét: InvokeMethod, CreateInstance, GetField, SetField, GetPropertyvagy SetProperty.
-vagy-
invokeAttra , CreateInstance , InvokeMethodGetField, SetFieldvagy GetProperty.SetProperty
-vagy-
invokeAttr mindkettőt GetField és SetField.
-vagy-
invokeAttr mindkettőt GetProperty és SetProperty.
-vagy-
invokeAttra (vagy InvokeMethoda) kombinációt SetField tartalmazzaSetProperty.
-vagy-
invokeAttr több elemet tartalmaz SetField és args tartalmaz.
-vagy-
Ez a metódus egy COM-objektumon van meghívva, és a következő kötésjelölők egyike nem lett átadva: BindingFlags.InvokeMethod, BindingFlags.GetProperty, BindingFlags.SetProperty, BindingFlags.PutDispPropertyvagy BindingFlags.PutRefDispProperty.
-vagy-
Az egyik elnevezett paramétertömb tartalmaz egy sztringet, amely az null.
A megadott tag egy osztály inicializálója.
A mező vagy tulajdonság nem található.
Nem található olyan metódus, amely megegyezik a következő argumentumokkal args: .
-vagy-
Az aktuális Type objektum egy olyan típust jelöl, amely nyitott típusparamétereket tartalmaz, ContainsGenericParameters azaz visszaadja a függvényt true.
A megadott tag nem hívható meg a következőn target: .
Egynél több metódus felel meg a kötési feltételeknek.
Az általuk name képviselt metódus egy vagy több meghatározatlan általános típusparamétert tartalmaz. Ez azt jelzi, hogy a metódus tulajdonsága ContainsGenericParameters ad vissza true.
Megjegyzések
Bár az alapértelmezett kötő nem dolgozza fel a CultureInfo (a culture paramétert), az absztrakt System.Reflection.Binder osztály használatával írhat egy egyedi kötőt, amely feldolgozza a culture.
Note
Nem hívhat InvokeMember meg általános metódust.
A következő BindingFlags szűrőjelölőkkel határozhatja meg, hogy mely tagok szerepeljenek a keresésben:
Adja meg
BindingFlags.Public, hogy a nyilvános tagok szerepeljenek a keresésben.Adja meg
BindingFlags.NonPublic, hogy nem nyilvános tagokat (azaz privát, belső és védett tagokat) is belefoglaljon a keresésbe.Adja meg
BindingFlags.FlattenHierarchy, hogy statikus tagokat is belefoglaljon a hierarchiába.
A keresés működésének módosításához az alábbi BindingFlags módosító jelzők használhatók:
BindingFlags.IgnoreCasea eset figyelmen kívül hagyásáhozname.BindingFlags.DeclaredOnlycsak a deklarált Typetagok keresésére, nem pedig az egyszerűen öröklött tagokra.
A következő BindingFlags meghívási jelölőkkel jelezheti, hogy milyen műveletet kell elvégeznie a taggal:
CreateInstancekonstruktor meghívásához. Anamefigyelmen kívül van hagyva. Érvénytelen más meghívási jelzőkkel.InvokeMethodmetódus meghívásához, konstruktor vagy típus inicializáló nem. Érvénytelen a vagySetFieldaSetProperty. HaInvokeMethodönmagában van megadva,BindingFlags.PublicakkorBindingFlags.InstanceBindingFlags.Statica rendszer automatikusan belefoglalja.GetFieldmező értékének lekéréséhez. Érvénytelen aSetField.SetFieldmező értékének beállításához. Érvénytelen aGetField.GetPropertytulajdonság lekéréséhez. Érvénytelen aSetProperty.SetPropertytulajdonság beállításához. Érvénytelen aGetProperty.
További információért lásd a System.Reflection.BindingFlags jelű részt.
A rendszer meghív egy metódust, ha az alábbi feltételek mindegyike teljesül:
A metódusdeklarációban szereplő paraméterek száma megegyezik a tömb argumentumainak
argsszámával (kivéve, ha az alapértelmezett argumentumok a tagon vannak definiálva, ésBindingFlags.OptionalParamBindingmeg vannak adva).Az egyes argumentumok típusát a kötőanyag a paraméter típusára konvertálhatja.
A kötőanyag megtalálja az összes megfelelő metódust. Ezek a metódusok a kért kötés típusa (BindingFlags értékek InvokeMethodstb GetProperty.) alapján találhatók. A metódusok halmazát a kötőanyagban definiált név, argumentumok száma és keresési módosítók halmaza szűri.
A metódus kiválasztása után a metódus meg lesz hívva. Az akadálymentesség ekkor be van jelölve. A keresés szabályozhatja, hogy a metódushoz társított akadálymentességi attribútum alapján mely metódusok kereshetők. Az Binder.BindToMethod osztály metódusa Binder felel a meghívandó metódus kiválasztásáért. Az alapértelmezett kötés a legspecifikusabb egyezést választja ki.
A hozzáférési korlátozások figyelmen kívül lesznek hagyva a teljes mértékben megbízható kód esetében; vagyis a magánkonstruktorok, metódusok, mezők és tulajdonságok akkor érhetők el és hívhatók meg a Reflection használatával, ha a kód teljes mértékben megbízható.
A mezőket egy adott értékre állíthatja Type.InvokeMember be a megadott érték megadásával BindingFlags.SetField. Ha például egy F nevű nyilvános példánymezőt szeretne beállítani a C osztályban, és az F egy String olyan kód, mint például:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {"strings new value"}, null);
Ha az F egy String[], a következő kódokat használhatja:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {new String[]{"a","z","c","d"}}, null);
amely inicializálja az F mezőt az új tömbbe. A tömbök pozícióját úgy is Type.InvokeMember beállíthatja, hogy megadja az érték indexét, majd a következő értéket az alábbi kóddal:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {1, "b"}, null);
Ez megváltoztatja a "z" sztringet abban a tömbben, amelyet az F tart a "b" sztringre.
Amikor meghív egy tagot IDispatch , a tagnév helyett a DispID azonosítót is megadhatja a[DispID=##]" sztringformátummal. Ha például a MyComMethod dispID azonosítója 3, a "MyComMethod" helyett a "[DispID=3]" sztringet adhatja meg. A tag meghívása a DispID alapján gyorsabb, mint a tag név szerinti keresése. Összetett összesítési forgatókönyvekben néha a DispID az egyetlen módja a kívánt tag meghívásának.
Note
Ez a módszer akkor használható a nem nyilvános tagok elérésére, ha a hívó a jelölővel ReflectionPermission rendelkezikReflectionPermissionFlag.RestrictedMemberAccess, és ha a nem nyilvános tagok támogatási készlete a hívó támogatási csoportjára vagy annak egy részhalmazára korlátozódik. (Lásd a tükröződés biztonsági szempontjait.)
A funkció használatához az alkalmazásnak a .NET Framework 3.5-ös vagy újabb verziójára kell irányulnia.
Lásd még
- String
- Binder
- DefaultBinder
- BindingFlags
- ParameterModifier
- ParameterAttributes
- CultureInfo
- ReflectionPermission
A következőre érvényes:
InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[])
- Forrás:
- Type.cs
- Forrás:
- Type.cs
- Forrás:
- Type.cs
- Forrás:
- Type.cs
- Forrás:
- Type.cs
Ha egy származtatott osztályban felül van bírálva, meghívja a megadott tagot a megadott kötési korlátozások használatával, és megfelel a megadott argumentumlistának, módosítóknak és kultúrának.
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);
[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicProperties | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicProperties)]
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);
[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.All)]
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);
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);
[<System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicProperties | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicProperties)>]
abstract member InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] * System.Reflection.ParameterModifier[] * System.Globalization.CultureInfo * string[] -> obj
[<System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.All)>]
abstract member InvokeMember : string * System.Reflection.BindingFlags * System.Reflection.Binder * obj * obj[] * System.Reflection.ParameterModifier[] * System.Globalization.CultureInfo * string[] -> obj
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
Paraméterek
- name
- String
A meghívandó konstruktor, metódus, tulajdonság vagy mezőtag nevét tartalmazó sztring.
-vagy-
Egy üres sztring ("") az alapértelmezett tag meghívásához.
-vagy-
Tagok esetén IDispatch a DispID-t képviselő sztring, például "[DispID=3]".
- invokeAttr
- BindingFlags
A számbavételi értékek bitenkénti kombinációja, amely meghatározza a keresés menetét. A hozzáférés lehet például a BindingFlags , Public, , NonPublicPrivate, InvokeMethodstb.GetField A keresés típusát nem kell megadni. Ha a keresés típusa nincs megadva, BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static akkor a rendszer használja.
- binder
- Binder
Olyan objektum, amely tulajdonságokat határoz meg, és engedélyezi a kötést, amely magában foglalhatja egy túlterhelt metódus kiválasztását, az argumentumtípusok kényszerítését és a tag meghívását a tükröződésen keresztül.
-vagy-
Null hivatkozás (Visual Basic semmi), a DefaultBinder használatához. Vegye figyelembe, hogy az objektum explicit definiálása Binder szükséges lehet a metódusok változóargumentumokkal való sikeres meghívásához.
- target
- Object
Az az objektum, amelyen a megadott tagot meg kell hívni.
- args
- Object[]
Egy tömb, amely a meghívandó tagnak átadni kívánt argumentumokat tartalmazza.
- modifiers
- ParameterModifier[]
A tömb megfelelő eleméhez ParameterModifier társított attribútumokat képviselő objektumtömbargs. A paraméter társított attribútumai a tag aláírásában vannak tárolva.
Az alapértelmezett kötőelem csak COM-összetevő meghívásakor dolgozza fel ezt a paramétert.
- culture
- CultureInfo
A CultureInfo használni kívánt globalizálási területi beállításokat képviselő objektum, amely a területi beállításokhoz szükséges lehet, például numerikus sztringek dupla értékké alakításához.
-vagy-
Nullhivatkozás (Nothing Visual Basic) az aktuális szál CultureInfo használatára.
- namedParameters
- String[]
Olyan tömb, amely azon paraméterek nevét tartalmazza, amelyeknek a tömb értékeit átadja a args rendszer.
Válaszok
A meghívott tag visszatérési értékét képviselő objektum.
Megvalósítás
- Attribútumok
Kivételek
invokeAttrnem tartalmazza és CreateInstance nem is tartalmazzaname.null
args és modifiers nem azonos hosszúságúak.
-vagy-
invokeAttr érvénytelen BindingFlags attribútum.
-vagy-
invokeAttr nem tartalmazza a következő kötésjelölők egyikét: InvokeMethod, CreateInstance, GetField, SetField, GetPropertyvagy SetProperty.
-vagy-
invokeAttra , CreateInstance , InvokeMethodGetField, SetFieldvagy GetProperty.SetProperty
-vagy-
invokeAttr mindkettőt GetField és SetField.
-vagy-
invokeAttr mindkettőt GetProperty és SetProperty.
-vagy-
invokeAttra (vagy InvokeMethoda) kombinációt SetField tartalmazzaSetProperty.
-vagy-
invokeAttr több elemet tartalmaz SetField és args tartalmaz.
-vagy-
A névvel ellátott paramétertömb nagyobb, mint az argumentumtömb.
-vagy-
Ez a metódus egy COM-objektumon van meghívva, és a következő kötésjelölők egyike nem lett átadva: BindingFlags.InvokeMethod, BindingFlags.GetProperty, BindingFlags.SetProperty, BindingFlags.PutDispPropertyvagy BindingFlags.PutRefDispProperty.
-vagy-
Az egyik elnevezett paramétertömb tartalmaz egy sztringet, amely az null.
A megadott tag egy osztály inicializálója.
A mező vagy tulajdonság nem található.
Nem található olyan metódus, amely megegyezik a következő argumentumokkal args: .
-vagy-
Nem található olyan tag, amely a megadott argumentumneveket tartalmazza namedParameters.
-vagy-
Az aktuális Type objektum egy olyan típust jelöl, amely nyitott típusparamétereket tartalmaz, ContainsGenericParameters azaz visszaadja a függvényt true.
A megadott tag nem hívható meg a következőn target: .
Egynél több metódus felel meg a kötési feltételeknek.
Az általuk name képviselt metódus egy vagy több meghatározatlan általános típusparamétert tartalmaz. Ez azt jelzi, hogy a metódus tulajdonsága ContainsGenericParameters ad vissza true.
Megjegyzések
InvokeMember meghív egy konstruktortagot vagy metódustagot, lekéri vagy beállít egy tulajdonságtagot, beolvas vagy beállít egy adatmezőtagot, vagy beolvas vagy beállít egy tömbtag egy elemét.
Note
Nem hívhat InvokeMember meg általános metódust.
Amikor meghív egy tagot IDispatch , a tagnév helyett a DispID azonosítót is megadhatja a[DispID=##]" sztringformátummal. Ha például a MyComMethod dispID azonosítója 3, a "MyComMethod" helyett a "[DispID=3]" sztringet adhatja meg. A tag meghívása a DispID alapján gyorsabb, mint a tag név szerinti keresése. Összetett összesítési forgatókönyvekben néha a DispID az egyetlen módja a kívánt tag meghívásának.
Bár az alapértelmezett iratgyűjtő nem dolgoz fel ParameterModifier vagy CultureInfo (a modifiersculture paraméterekkel) nem dolgoz fel, az absztrakt System.Reflection.Binder osztály használatával egyéni kötést írhat, amely feldolgoz modifiers és culture.
ParameterModifier csak com-interop-on keresztüli híváskor használatos, és csak a hivatkozás által átadott paramétereket kezeli a rendszer.
A tömb minden paramétere namedParameters a tömb megfelelő elemében kapja meg az args értéket. Ha a hossz args nagyobb, mint a hossza namedParameters, a fennmaradó argumentumértékek sorrendben lesznek átadva.
A namedParameters tömb használatával módosíthatja a bemeneti tömb argumentumainak sorrendjét. A M(string a, int b) metódus (M(ByVal a As String, ByVal b As Integer) Visual Basic) és a bemeneti tömb { 42, "x" } alapján a bemeneti tömb változatlanul átadható args, ha a tömb { "b", "a" }namedParameters.
A következő BindingFlags szűrőjelölőkkel határozhatja meg, hogy mely tagok szerepeljenek a keresésben:
Adja meg
BindingFlags.Public, hogy a nyilvános tagok szerepeljenek a keresésben.Adja meg
BindingFlags.NonPublic, hogy nem nyilvános tagokat (azaz privát, belső és védett tagokat) is belefoglaljon a keresésbe.Adja meg
BindingFlags.FlattenHierarchy, hogy statikus tagokat is belefoglaljon a hierarchiába.
A keresés működésének módosításához az alábbi BindingFlags módosító jelzők használhatók:
BindingFlags.IgnoreCasea eset figyelmen kívül hagyásáhozname.BindingFlags.DeclaredOnlycsak a deklarált Typetagok keresésére, nem pedig az egyszerűen öröklött tagokra.
A következő BindingFlags meghívási jelölőkkel jelezheti, hogy milyen műveletet kell elvégeznie a taggal:
CreateInstancekonstruktor meghívásához. Anamefigyelmen kívül van hagyva. Érvénytelen más meghívási jelzőkkel.InvokeMethodmetódus meghívásához, konstruktor vagy típus inicializáló nem. Érvénytelen a vagySetFieldaSetProperty. HaInvokeMethodönmagában van megadva,BindingFlags.PublicakkorBindingFlags.InstanceBindingFlags.Statica rendszer automatikusan belefoglalja.GetFieldmező értékének lekéréséhez. Érvénytelen aSetField.SetFieldmező értékének beállításához. Érvénytelen aGetField.GetPropertytulajdonság lekéréséhez. Érvénytelen aSetProperty.SetPropertytulajdonság beállításához. Érvénytelen aGetProperty.
További információért lásd a System.Reflection.BindingFlags jelű részt.
A rendszer meghív egy metódust, ha az alábbi feltételek mindegyike teljesül:
A metódusdeklarációban szereplő paraméterek száma megegyezik a tömb argumentumainak
argsszámával (kivéve, ha az alapértelmezett argumentumok a tagon vannak definiálva, ésBindingFlags.OptionalParamBindingmeg vannak adva).Az egyes argumentumok típusát a kötőanyag a paraméter típusára konvertálhatja.
A kötőanyag megtalálja az összes megfelelő metódust. Ezek a metódusok a kért kötés típusa (BindingFlags értékek InvokeMethodstb GetProperty.) alapján találhatók. A metódusok halmazát a kötőanyagban definiált név, argumentumok száma és keresési módosítók halmaza szűri.
A metódus kiválasztása után a metódus meg lesz hívva. Az akadálymentesség ekkor be van jelölve. A keresés szabályozhatja, hogy a metódushoz társított akadálymentességi attribútum alapján mely metódusok kereshetők. Az Binder.BindToMethod osztály metódusa Binder felel a meghívandó metódus kiválasztásáért. Az alapértelmezett kötés a legspecifikusabb egyezést választja ki.
InvokeMember az alapértelmezett értékekkel rendelkező paraméterekkel rendelkező metódusok meghívására használható. A metódusokhoz való kötéshez meg kell BindingFlags.OptionalParamBinding adni a tükröződést. Az alapértelmezett értékkel rendelkező paraméterek esetében megadhat egy másik értéket, vagy megadható Missing.Value az alapértelmezett érték használatához.
Vegyük például a MyMethod(int x, float y = 2,0) metódust. Ha ezt a metódust csak az első argumentummal szeretné meghívni MyMethod(4) néven, adja át a fenti kötésjelzők egyikét, és adjon át két argumentumot, azaz 4-et az első és a második argumentumhoz Missing.Value . Ha nem használja Missing.Value, nem hagyhatja ki az opcionális paramétereket a Invoke metódussal. Ha ezt meg kell tennie, használja InvokeMember inkább.
A hozzáférési korlátozások figyelmen kívül lesznek hagyva a teljes mértékben megbízható kód esetében; vagyis a magánkonstruktorok, metódusok, mezők és tulajdonságok akkor érhetők el és hívhatók meg System.Reflection , ha a kód teljes mértékben megbízható.
A mezőket egy adott értékre állíthatja Type.InvokeMember be a megadott érték megadásával BindingFlags.SetField. Ha például egy F nevű nyilvános példánymezőt szeretne beállítani a C osztályban, és az F egy String, akkor a következő kódot használhatja:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {"strings new value"}, null, null, null);
Ha az F egy String[], a következő kódokat használhatja:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {new String[]{"a","z","c","d"}}, null, null, null);
amely inicializálja az F mezőt az új tömbbe. A tömbök pozícióját úgy is Type.InvokeMember beállíthatja, hogy megadja az érték indexét, majd a következő értéket az alábbi kóddal:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {1, "b"}, null, null, null);
Ez megváltoztatja a "z" sztringet abban a tömbben, amelyet az F tart a "b" sztringre.
Note
Ez a módszer akkor használható a nem nyilvános tagok elérésére, ha a hívó a jelölővel ReflectionPermission rendelkezikReflectionPermissionFlag.RestrictedMemberAccess, és ha a nem nyilvános tagok támogatási készlete a hívó támogatási csoportjára vagy annak egy részhalmazára korlátozódik. (Lásd a tükröződés biztonsági szempontjait.)
A funkció használatához az alkalmazásnak a .NET Framework 3.5-ös vagy újabb verziójára kell irányulnia.
Lásd még
- String
- Binder
- DefaultBinder
- BindingFlags
- ParameterModifier
- ParameterAttributes
- CultureInfo
- ReflectionPermission