Type.InvokeMember Metoda
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Vyvolá konkrétního člena aktuálního Typesouboru .
Přetížení
InvokeMember(String, BindingFlags, Binder, Object, Object[]) |
Vyvolá zadaný člen pomocí zadaných vazeb a odpovídající seznamu zadaných argumentů. |
InvokeMember(String, BindingFlags, Binder, Object, Object[], CultureInfo) |
Vyvolá zadaný člen pomocí zadaných vazeb a odpovídající seznamu argumentů a jazykové verze. |
InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[]) |
Při přepsání v odvozené třídě vyvolá zadaného člena pomocí zadaných vazeb omezení a odpovídá zadanému seznamu argumentů, modifikátorům a jazykové verzi. |
InvokeMember(String, BindingFlags, Binder, Object, Object[])
- Zdroj:
- Type.cs
- Zdroj:
- Type.cs
- Zdroj:
- Type.cs
Vyvolá zadaný člen pomocí omezení zadané vazby a odpovídající seznamu zadaných argumentů.
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
Parametry
- name
- String
Řetězec obsahující název konstruktoru, metody, vlastnosti nebo člena pole, který se má vyvolat.
-nebo-
Prázdný řetězec ("") pro vyvolání výchozího člena.
-nebo-
Pro IDispatch
členy řetězec představující DispID, například "[DispID=3]".
- invokeAttr
- BindingFlags
Bitové kombinace hodnot výčtu, které určují, jak se provádí hledání. Přístup může být například BindingFlags
Public
, NonPublic
, Private
, InvokeMethod
, GetField
, atd. Typ vyhledávání není nutné zadávat. Pokud je typ vyhledávání vynechán, BindingFlags.Public
| | BindingFlags.Instance
BindingFlags.Static
použijí se.
- binder
- Binder
Objekt, který definuje sadu vlastností a umožňuje vázání, jež může zahrnovat výběr přetěžované metody, vynucení typů argumentů a vyvolání členu prostřednictvím reflexe.
-nebo-
Odkaz null (Nothing
v jazyce Visual Basic) pro použití DefaultBinder. Všimněte si, že explicitní definování objektu Binder může být vyžadováno pro úspěšné vyvolání přetížení metody s argumenty proměnných.
- target
- Object
Objekt, na kterém se má vyvolat zadaný člen.
- args
- Object[]
Pole obsahující argumenty, které se mají předat členu, který se má vyvolat.
Návraty
Objekt představující návratovou hodnotu vyvolaného členu.
Implementuje
Výjimky
invokeAttr
neobsahuje CreateInstance
a name
je null
.
invokeAttr
není platný BindingFlags atribut.
-nebo-
invokeAttr
neobsahuje jeden z následujících příznaků vazby: InvokeMethod
, CreateInstance
, GetField
, SetField
, GetProperty
nebo SetProperty
.
-nebo-
invokeAttr
obsahuje CreateInstance
v kombinaci s InvokeMethod
, SetField
GetField
, , GetProperty
nebo SetProperty
.
-nebo-
invokeAttr
obsahuje a GetField
SetField
.
-nebo-
invokeAttr
obsahuje a GetProperty
SetProperty
.
-nebo-
invokeAttr
obsahuje InvokeMethod
v kombinaci s SetField
nebo SetProperty
.
-nebo-
invokeAttr
obsahuje SetField
a args
obsahuje více než jeden prvek.
-nebo-
Tato metoda je volána v objektu COM a nebyl předán jeden z následujících příznaků vazby: BindingFlags.InvokeMethod
, BindingFlags.GetProperty
, BindingFlags.SetProperty
, BindingFlags.PutDispProperty
nebo BindingFlags.PutRefDispProperty
.
-nebo-
Jedno z pojmenovaných polí parametrů obsahuje řetězec, který je null
.
Zadaný člen je inicializátor třídy.
Pole nebo vlastnost nelze najít.
Nelze najít žádnou metodu, která by odpovídala argumentů v args
souboru .
-nebo-
Aktuální Type objekt představuje typ, který obsahuje parametry typu open, to znamená, ContainsGenericParameters že vrací true
.
Zadaný člen nelze vyvolat v systému target
.
Více než jedna metoda odpovídá kritériím vazby.
.NET Compact Framework v současné době nepodporuje tuto metodu.
Metoda reprezentovaná má name
jeden nebo více nespecifikovaných parametrů obecného typu. To znamená, že vlastnost metody ContainsGenericParameters vrátí true
.
Příklady
Následující příklad používá InvokeMember
pro přístup ke členům typu.
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
Poznámky
Poznámka
Nelze použít InvokeMember k vyvolání obecné metody.
BindingFlags Následující příznaky filtru lze použít k definování členů, které se mají zahrnout do hledání:
Zadejte
BindingFlags.Public
, aby se do hledání zahrnuli veřejní členové.Zadejte
BindingFlags.NonPublic
, aby se do hledání zahrnuli neveřejní členové (tj. soukromé a chráněné členy).Zadejte
BindingFlags.FlattenHierarchy
, aby se statické členy zahrnuly v hierarchii.
Pomocí následujících BindingFlags modifikačních příznaků můžete změnit fungování vyhledávání:
BindingFlags.IgnoreCase
pokud chcete ignorovat případname
.BindingFlags.DeclaredOnly
prohledat pouze členy deklarované na Type, nikoli členy, které byly jednoduše zděděny.
K označení akce, kterou se má člen provést, můžete použít následující BindingFlags příznaky vyvolání:
CreateInstance
k vyvolání konstruktoru.name
se ignoruje. Není platné s jinými příznaky vyvolání.InvokeMethod
k vyvolání metody, ale ne konstruktoru nebo inicializátoru typu. Neplatné sSetField
neboSetProperty
. PokudInvokeMethod
je zadaný sám,BindingFlags.Public
automaticky se zahrnou ,BindingFlags.Instance
aBindingFlags.Static
.GetField
a získejte hodnotu pole. Není platné proSetField
.SetField
a nastavte hodnotu pole. Není platné proGetField
.GetProperty
a získejte vlastnost. Není platné proSetProperty
.SetProperty
a nastavte vlastnost. Není platné proGetProperty
.
Další informace naleznete v tématu System.Reflection.BindingFlags.
Metoda bude vyvolána, pokud jsou splněny obě následující podmínky:
Počet parametrů v deklaraci metody se rovná počtu argumentů v
args
matici (pokud nejsou u členu definovány výchozí argumenty aBindingFlags.OptionalParamBinding
nejsou zadány).Typ každého argumentu může pořadač převést na typ parametru.
Pořadač najde všechny odpovídající metody. Tyto metody se najdou na základě typu požadované vazby (BindingFlags hodnoty InvokeMethod
, GetProperty
atd.). Sada metod je filtrována podle názvu, počtu argumentů a sady modifikátorů hledání definovaných v pořadači.
Po výběru je metoda vyvolána. Přístupnost je v tomto okamžiku zaškrtnutá. Vyhledávání může řídit, která sada metod se prohledá na základě atributu přístupnosti přidruženého k metodě. Metoda Binder.BindToMethodBinder třídy je zodpovědná za výběr metody, která se má vyvolat. Výchozí pořadač vybere nejkonifernější shodu.
Omezení přístupu jsou ignorována pro plně důvěryhodný kód. to znamená, že privátní konstruktory, metody, pole a vlastnosti mohou být přístupné a vyvolány prostřednictvím System.Reflection vždy, když je kód plně důvěryhodný.
Můžete použít Type.InvokeMember
k nastavení pole na určitou hodnotu zadáním BindingFlags.SetField. Pokud například chcete nastavit pole veřejné instance s názvem F ve třídě C a F je String
, můžete použít například kód:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {"strings new value"});
Pokud je String[]
F , můžete použít například kód:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {new String[]{"a","z","c","d"}});
, který inicializuje pole F na toto nové pole. Můžete také použít Type.InvokeMember
k nastavení pozice v poli zadáním indexu hodnoty a pak další hodnoty pomocí kódu, jako je například následující:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {1, "b"});
Tím se změní řetězec "z" v poli, který F drží na řetězec "b".
Při vyvolání člena IDispatch
můžete místo názvu člena zadat dispID pomocí formátu řetězce [DispID=##]. Pokud je například DispID myComMethod 3, můžete místo "MyComMethod" zadat řetězec "[DispID=3]". Vyvolání člena pomocí DispID je rychlejší než vyhledání člena podle jména. Ve složitých scénářích agregace je dispID někdy jediným způsobem, jak vyvolat požadovaného člena.
Poznámka
Počínaje rozhraním .NET Framework 2.0 Service Pack 1 lze tuto metodu použít pro přístup k neveřejným členům, pokud volajícímu byl udělen ReflectionPermissionReflectionPermissionFlag.RestrictedMemberAccess příznak a pokud je sada udělení neveřejných členů omezena na sadu udělení volajícího nebo její podmnožinu. (Viz Aspekty zabezpečení pro reflexi.)
Pokud chcete tuto funkci používat, měla by vaše aplikace cílit na rozhraní .NET Framework 3.5 nebo novější.
Viz také
- String
- Binder
- DefaultBinder
- BindingFlags
- ParameterModifier
- ParameterAttributes
- CultureInfo
- ReflectionPermission
Platí pro
InvokeMember(String, BindingFlags, Binder, Object, Object[], CultureInfo)
- Zdroj:
- Type.cs
- Zdroj:
- Type.cs
- Zdroj:
- Type.cs
Vyvolá zadaný člen pomocí zadaných vazeb a odpovídající seznamu argumentů a jazykové verze.
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
Parametry
- name
- String
Řetězec obsahující název konstruktoru, metody, vlastnosti nebo člena pole k vyvolání.
-nebo-
Prázdný řetězec ("") pro vyvolání výchozího člena.
-nebo-
Pro IDispatch
členy řetězec představující DispID, například "[DispID=3]".
- invokeAttr
- BindingFlags
Bitové kombinace hodnot výčtu, které určují způsob provedení hledání. Přístup může být například BindingFlags
Public
, , NonPublic
, Private
InvokeMethod
, GetField
, atd. Typ vyhledávání není nutné zadávat. Pokud je typ vyhledávání vynechán, BindingFlags.Public
| | BindingFlags.Instance
BindingFlags.Static
použijí se.
- binder
- Binder
Objekt, který definuje sadu vlastností a umožňuje vázání, jež může zahrnovat výběr přetěžované metody, vynucení typů argumentů a vyvolání členu prostřednictvím reflexe.
-nebo-
Nulový odkaz (Nothing
v jazyce Visual Basic) pro použití .DefaultBinder Všimněte si, že explicitní definování objektu Binder může být vyžadováno pro úspěšné vyvolání přetížení metody s argumenty proměnných.
- target
- Object
Objekt, na kterém se má vyvolat zadaný člen.
- args
- Object[]
Pole obsahující argumenty, které se mají předat členu k vyvolání.
- culture
- CultureInfo
Objekt představující používané národní prostředí globalizace, které může být nezbytné pro převody specifické pro národní prostředí, jako je například převod čísla String na Double.
-nebo-
Nulový odkaz (Nothing
v jazyce Visual Basic) pro použití aktuálního CultureInfovlákna .
Návraty
Objekt představující návratovou hodnotu vyvolaného členu.
Implementuje
Výjimky
invokeAttr
neobsahuje CreateInstance
a name
je null
.
invokeAttr
není platný BindingFlags atribut.
-nebo-
invokeAttr
neobsahuje jeden z následujících příznaků vazby: InvokeMethod
, CreateInstance
, GetField
, SetField
, GetProperty
nebo SetProperty
.
-nebo-
invokeAttr
obsahuje CreateInstance
v kombinaci s InvokeMethod
, GetField
, SetField
, GetProperty
nebo SetProperty
.
-nebo-
invokeAttr
obsahuje i GetField
SetField
.
-nebo-
invokeAttr
obsahuje i GetProperty
SetProperty
.
-nebo-
invokeAttr
obsahuje InvokeMethod
v kombinaci s SetField
nebo SetProperty
.
-nebo-
invokeAttr
obsahuje SetField
a args
obsahuje více než jeden prvek.
-nebo-
Tato metoda je volána u objektu COM a nebyl předán jeden z následujících příznaků vazby: BindingFlags.InvokeMethod
, BindingFlags.GetProperty
, BindingFlags.SetProperty
, BindingFlags.PutDispProperty
nebo BindingFlags.PutRefDispProperty
.
-nebo-
Jedno z pojmenovaných polí parametrů obsahuje řetězec , který je null
.
Zadaný člen je inicializátor třídy.
Pole nebo vlastnost nebyly nalezeny.
Nebyla nalezena žádná metoda, která by odpovídala argumentu v args
souboru .
-nebo-
Aktuální Type objekt představuje typ, který obsahuje parametry otevřeného typu, to znamená, ContainsGenericParameters že vrací true
.
Zadaný člen nelze vyvolat v .target
Kritériím vazby odpovídá více než jedna metoda.
Metoda reprezentovaná parametrem name
má jeden nebo více neurčené parametry obecného typu. To znamená, že vlastnost metody ContainsGenericParameters vrátí true
.
Poznámky
I když výchozí pořadač nezpracovává CultureInfo ( culture
parametr), můžete použít abstraktní System.Reflection.Binder třídu k zápisu vlastního pořadače, který zpracovává culture
.
Poznámka
Nelze použít InvokeMember k vyvolání obecné metody.
Následující BindingFlags příznaky filtru lze použít k definování členů, které se mají zahrnout do hledání:
Zadejte
BindingFlags.Public
, chcete-li do hledání zahrnout veřejné členy.Zadejte
BindingFlags.NonPublic
, pokud chcete do hledání zahrnout neveřejné členy (tj. soukromé, interní a chráněné členy).Zadejte
BindingFlags.FlattenHierarchy
, chcete-li zahrnout statické členy v hierarchii.
Pomocí následujících BindingFlags příznaků modifikátoru můžete změnit způsob fungování vyhledávání:
BindingFlags.IgnoreCase
pokud chcete ignorovat případname
.BindingFlags.DeclaredOnly
hledat pouze členy deklarované na Type, nikoli členy, které byly jednoduše zděděny.
Následující BindingFlags příznaky volání se dají použít k označení akce, která se má s členem provést:
CreateInstance
pro vyvolání konstruktoru.name
se ignoruje. Není platné u jiných příznaků volání.InvokeMethod
k vyvolání metody, ale ne konstruktoru nebo inicializátoru typu. Není platné proSetField
neboSetProperty
. PokudInvokeMethod
je zadaný samostatně,BindingFlags.Public
automaticky se zahrnou ,BindingFlags.Instance
aBindingFlags.Static
.GetField
, abyste získali hodnotu pole. Není platné proSetField
.SetField
a nastavte hodnotu pole. Není platné proGetField
.GetProperty
a získejte vlastnost. Není platné proSetProperty
.SetProperty
a nastavte vlastnost. Není platné proGetProperty
.
Další informace naleznete v tématu System.Reflection.BindingFlags.
Metoda bude vyvolána, pokud jsou splněny obě následující podmínky:
Počet parametrů v deklaraci metody se rovná počtu argumentů v
args
matici (pokud nejsou u členu definovány výchozí argumenty aBindingFlags.OptionalParamBinding
nejsou zadány).Typ každého argumentu může být převeden pořadačem na typ parametru.
Pořadač najde všechny odpovídající metody. Tyto metody se najdou na základě typu požadované vazby (BindingFlags hodnoty InvokeMethod
, GetProperty
atd.). Sada metod je filtrována podle názvu, počtu argumentů a sady modifikátorů vyhledávání definovaných v pořadači.
Po výběru metody se vyvolá. V tomto okamžiku je zaškrtnuté políčko Přístupnost. Vyhledávání může řídit, která sada metod se prohledá na základě atributu přístupnosti přidruženého k metodě. Metoda Binder.BindToMethodBinder třídy je zodpovědná za výběr metody, která má být vyvolána. Výchozí pořadač vybere nejkonseifnější shodu.
Omezení přístupu jsou ignorována pro plně důvěryhodný kód; To znamená, že k soukromým konstruktorům, metodám, polím a vlastnostem lze přistupovat a vyvolat je prostřednictvím reflexe vždy, když je kód plně důvěryhodný.
Zadáním příkazu Type.InvokeMember
můžete nastavit pole na určitou hodnotu.BindingFlags.SetField Pokud například chcete nastavit pole veřejné instance s názvem F ve třídě C a F je , String
můžete použít například následující kód:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {"strings new value"}, null);
Pokud je F , String[]
můžete použít například následující kód:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {new String[]{"a","z","c","d"}}, null);
, která inicializuje pole F do tohoto nového pole. Můžete také použít Type.InvokeMember
k nastavení pozice v poli tak, že zadáte index hodnoty a pak další hodnotu pomocí kódu, jako je tento:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {1, "b"}, null);
Tím se změní řetězec "z" v poli, který F drží na řetězec "b".
Při vyvolání členu IDispatch
můžete místo názvu členu zadat DispID pomocí formátu řetězce "[DispID=##]". Pokud je například DispID myComMethod 3, můžete místo "MyComMethod" zadat řetězec "[DispID=3]". Vyvolání člena podle DispID je rychlejší než vyhledání člena podle jména. Ve složitých scénářích agregace je dispID někdy jediným způsobem, jak vyvolat požadovaného člena.
Poznámka
Počínaje .NET Framework 2.0 Service Pack 1 lze tuto metodu použít pro přístup k neveřejným členům, pokud byl volajícímu udělen ReflectionPermissionReflectionPermissionFlag.RestrictedMemberAccess příznak a pokud je sada udělení neveřejných členů omezena na sadu grantů volajícího nebo její podmnožinu. (Viz Aspekty zabezpečení pro reflexi.)
Pokud chcete tuto funkci používat, měla by vaše aplikace cílit na rozhraní .NET Framework 3.5 nebo novější.
Viz také
- String
- Binder
- DefaultBinder
- BindingFlags
- ParameterModifier
- ParameterAttributes
- CultureInfo
- ReflectionPermission
Platí pro
InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[])
- Zdroj:
- Type.cs
- Zdroj:
- Type.cs
- Zdroj:
- Type.cs
Při přepsání v odvozené třídě vyvolá zadaného člena pomocí zadaných vazeb omezení a odpovídá zadanému seznamu argumentů, modifikátorům a jazykové verzi.
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
Parametry
- name
- String
Řetězec obsahující název konstruktoru, metody, vlastnosti nebo člena pole, který se má vyvolat.
-nebo-
Prázdný řetězec ("") pro vyvolání výchozího člena.
-nebo-
Pro IDispatch
členy řetězec představující DispID, například "[DispID=3]".
- invokeAttr
- BindingFlags
Bitové kombinace hodnot výčtu, které určují, jak se provádí hledání. Přístup může být například BindingFlags
Public
, NonPublic
, Private
, InvokeMethod
, GetField
, atd. Typ vyhledávání není nutné zadávat. Pokud je typ vyhledávání vynechán, BindingFlags.Public
| | BindingFlags.Instance
BindingFlags.Static
použijí se.
- binder
- Binder
Objekt, který definuje sadu vlastností a umožňuje vázání, jež může zahrnovat výběr přetěžované metody, vynucení typů argumentů a vyvolání členu prostřednictvím reflexe.
-nebo-
Odkaz null (Nothing v jazyce Visual Basic) pro použití DefaultBinder. Všimněte si, že explicitní definování objektu Binder může být vyžadováno pro úspěšné vyvolání přetížení metody s argumenty proměnných.
- target
- Object
Objekt, na kterém se má vyvolat zadaný člen.
- args
- Object[]
Pole obsahující argumenty, které se mají předat členu, který se má vyvolat.
- modifiers
- ParameterModifier[]
Pole ParameterModifier objektů představující atributy přidružené k odpovídajícímu prvku v args
poli. Přidružené atributy parametru jsou uloženy v podpisu člena.
Výchozí pořadač zpracovává tento parametr pouze při volání komponenty modelu COM.
- culture
- CultureInfo
Objekt CultureInfo představující globalizační národní prostředí, které se má použít, což může být nezbytné pro převody specifické pro národní prostředí, jako je například převod číselného řetězce na double.
-nebo-
Odkaz null (Nothing
v jazyce Visual Basic) pro použití aktuálního CultureInfovlákna .
- namedParameters
- String[]
Pole obsahující názvy parametrů, kterým jsou předány hodnoty v args
poli.
Návraty
Objekt představující návratovou hodnotu vyvolaného členu.
Implementuje
Výjimky
invokeAttr
neobsahuje CreateInstance
a name
je null
.
args
a modifiers
nemají stejnou délku.
-nebo-
invokeAttr
není platný BindingFlags atribut.
-nebo-
invokeAttr
neobsahuje jeden z následujících příznaků vazby: InvokeMethod
, CreateInstance
, GetField
, SetField
, GetProperty
nebo SetProperty
.
-nebo-
invokeAttr
obsahuje CreateInstance
v kombinaci s InvokeMethod
, SetField
GetField
, , GetProperty
nebo SetProperty
.
-nebo-
invokeAttr
obsahuje a GetField
SetField
.
-nebo-
invokeAttr
obsahuje a GetProperty
SetProperty
.
-nebo-
invokeAttr
obsahuje InvokeMethod
v kombinaci s SetField
nebo SetProperty
.
-nebo-
invokeAttr
obsahuje SetField
a args
obsahuje více než jeden prvek.
-nebo-
Pole pojmenovaných parametrů je větší než pole argumentů.
-nebo-
Tato metoda je volána v objektu COM a nebyl předán jeden z následujících příznaků vazby: BindingFlags.InvokeMethod
, BindingFlags.GetProperty
, BindingFlags.SetProperty
, BindingFlags.PutDispProperty
nebo BindingFlags.PutRefDispProperty
.
-nebo-
Jedno z pojmenovaných polí parametrů obsahuje řetězec, který je null
.
Zadaný člen je inicializátor třídy.
Pole nebo vlastnost nelze najít.
Nelze najít žádnou metodu, která by odpovídala argumentů v args
souboru .
-nebo-
Nelze najít člena s názvy argumentů zadanými v namedParameters
.
-nebo-
Aktuální Type objekt představuje typ, který obsahuje parametry typu open, to znamená, ContainsGenericParameters že vrací true
.
Zadaný člen nelze vyvolat v systému target
.
Více než jedna metoda odpovídá kritériím vazby.
Metoda reprezentovaná má name
jeden nebo více nespecifikovaných parametrů obecného typu. To znamená, že vlastnost metody ContainsGenericParameters vrátí true
.
Poznámky
InvokeMember
volá člen konstruktoru nebo člen metody, získá nebo nastaví člen vlastnosti, získá nebo nastaví člena datového pole nebo získá nebo nastaví prvek člena pole.
Poznámka
Nelze použít InvokeMember k vyvolání obecné metody.
Při vyvolání člena IDispatch
můžete místo názvu člena zadat DispID pomocí formátu řetězce [DispID=##].. Pokud je například DispID myComMethod 3, můžete místo "MyComMethod" zadat řetězec "[DispID=3]". Vyvolání člena pomocí DispID je rychlejší než vyhledání člena podle jména. Ve složitých scénářích agregace je dispID někdy jediným způsobem, jak vyvolat požadovaného člena.
I když výchozí pořadač nezpracuje ParameterModifier nebo CultureInfo ( modifiers
parametry a culture
), můžete použít abstraktní System.Reflection.Binder třídu k zápisu vlastního pořadače, který zpracovává modifiers
a culture
.
ParameterModifier
se používá pouze při volání prostřednictvím zprostředkovatele komunikace COM a jsou zpracovány pouze parametry, které jsou předány odkazem.
Každý parametr v namedParameters
poli získá hodnotu v odpovídajícím prvku v args
poli. Pokud je délka parametru args
větší než délka parametru namedParameters
, předají se zbývající hodnoty argumentů v pořadí.
Pole namedParameters
lze použít ke změně pořadí argumentů ve vstupním poli. Například s ohledem na metodu M(string a, int b)
(M(ByVal a As String, ByVal b As Integer)
v jazyce Visual Basic) a vstupní pole { 42, "x" }
lze vstupní pole předat beze změny do args
, pokud je pole { "b", "a" }
zadáno pro namedParameters
.
BindingFlags Následující příznaky filtru lze použít k definování členů, které se mají zahrnout do hledání:
Zadejte
BindingFlags.Public
, aby se do hledání zahrnuli veřejní členové.Zadejte
BindingFlags.NonPublic
, aby se do hledání zahrnuli neveřejní členové (tj. soukromé, interní a chráněné členy).Zadejte
BindingFlags.FlattenHierarchy
, aby se statické členy zahrnuly v hierarchii.
Pomocí následujících BindingFlags modifikačních příznaků můžete změnit fungování vyhledávání:
BindingFlags.IgnoreCase
pokud chcete ignorovat případname
.BindingFlags.DeclaredOnly
prohledat pouze členy deklarované na Type, nikoli členy, které byly jednoduše zděděny.
K označení akce, kterou se má člen provést, můžete použít následující BindingFlags příznaky vyvolání:
CreateInstance
k vyvolání konstruktoru.name
se ignoruje. Není platné s jinými příznaky vyvolání.InvokeMethod
k vyvolání metody, ale ne konstruktoru nebo inicializátoru typu. Neplatné sSetField
neboSetProperty
. PokudInvokeMethod
je zadaný sám,BindingFlags.Public
automaticky se zahrnou ,BindingFlags.Instance
aBindingFlags.Static
.GetField
a získejte hodnotu pole. Není platné proSetField
.SetField
a nastavte hodnotu pole. Není platné proGetField
.GetProperty
a získejte vlastnost. Není platné proSetProperty
.SetProperty
a nastavte vlastnost. Není platné proGetProperty
.
Další informace naleznete v tématu System.Reflection.BindingFlags.
Metoda bude vyvolána, pokud jsou splněny obě následující podmínky:
Počet parametrů v deklaraci metody se rovná počtu argumentů v
args
matici (pokud nejsou u členu definovány výchozí argumenty aBindingFlags.OptionalParamBinding
nejsou zadány).Typ každého argumentu může pořadač převést na typ parametru.
Pořadač najde všechny odpovídající metody. Tyto metody se najdou na základě typu požadované vazby (BindingFlags hodnoty InvokeMethod
, GetProperty
atd.). Sada metod je filtrována podle názvu, počtu argumentů a sady modifikátorů hledání definovaných v pořadači.
Po výběru je metoda vyvolána. Přístupnost je v tomto okamžiku zaškrtnutá. Vyhledávání může řídit, která sada metod se prohledá na základě atributu přístupnosti přidruženého k metodě. Metoda Binder.BindToMethodBinder třídy je zodpovědná za výběr metody, která se má vyvolat. Výchozí pořadač vybere nejkonifernější shodu.
InvokeMember
lze použít k vyvolání metod s parametry, které mají výchozí hodnoty. Pokud chcete vytvořit vazbu na tyto metody, reflexe vyžaduje BindingFlags.OptionalParamBinding , aby byla zadána. U parametru, který má výchozí hodnotu, můžete buď zadat jinou hodnotu, nebo zadat Missing.Value výchozí hodnotu.
Představte si například metodu MyMethod(int x, float y = 2.0). Chcete-li vyvolat tuto metodu pouze s prvním argumentem jako MyMethod(4), předejte jeden z výše uvedených příznaků vazby a předejte dva argumenty, a to 4 pro první argument a Missing.Value
pro druhý argument. Pokud nepoužíváte Missing.Value
, nesmíte vynechat volitelné parametry metody Invoke
. Pokud to musíte udělat, použijte InvokeMember
místo toho.
Omezení přístupu jsou ignorována pro plně důvěryhodný kód. to znamená, že privátní konstruktory, metody, pole a vlastnosti mohou být přístupné a vyvolány prostřednictvím System.Reflection vždy, když je kód plně důvěryhodný.
Můžete použít Type.InvokeMember
k nastavení pole na určitou hodnotu zadáním BindingFlags.SetField. Pokud například chcete nastavit pole veřejné instance s názvem F ve třídě C a F je String
, můžete použít například kód:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {"strings new value"}, null, null, null);
Pokud je String[]
F , můžete použít například kód:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {new String[]{"a","z","c","d"}}, null, null, null);
, který inicializuje pole F na toto nové pole. Můžete také použít Type.InvokeMember
k nastavení pozice v poli zadáním indexu hodnoty a pak další hodnoty pomocí kódu, jako je například následující:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {1, "b"}, null, null, null);
Tím se změní řetězec "z" v poli, který F drží na řetězec "b".
Poznámka
Počínaje .NET Framework 2.0 Service Pack 1 lze tuto metodu použít pro přístup k neveřejným členům, pokud byl volajícímu udělen ReflectionPermissionReflectionPermissionFlag.RestrictedMemberAccess příznak a pokud je sada udělení neveřejných členů omezena na sadu grantů volajícího nebo její podmnožinu. (Viz Aspekty zabezpečení pro reflexi.)
Pokud chcete tuto funkci používat, měla by vaše aplikace cílit na rozhraní .NET Framework 3.5 nebo novější.
Viz také
- String
- Binder
- DefaultBinder
- BindingFlags
- ParameterModifier
- ParameterAttributes
- CultureInfo
- ReflectionPermission