Type.InvokeMember Metoda
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Wywołuje określonego członka bieżącego Typeelementu .
Przeciążenia
InvokeMember(String, BindingFlags, Binder, Object, Object[]) |
Wywołuje określony element członkowski przy użyciu określonych ograniczeń powiązania i dopasowania do określonej listy argumentów. |
InvokeMember(String, BindingFlags, Binder, Object, Object[], CultureInfo) |
Wywołuje określony element członkowski przy użyciu określonych ograniczeń powiązania i dopasowania określonej listy argumentów i kultury. |
InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[]) |
Podczas zastępowania w klasie pochodnej wywołuje określony element członkowski przy użyciu określonych ograniczeń powiązania i dopasowania określonej listy argumentów, modyfikatorów i kultury. |
InvokeMember(String, BindingFlags, Binder, Object, Object[])
- Źródło:
- Type.cs
- Źródło:
- Type.cs
- Źródło:
- Type.cs
Wywołuje określony element członkowski przy użyciu określonych ograniczeń powiązania i dopasowywania określonej listy argumentów.
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
Ciąg zawierający nazwę konstruktora, metody, właściwości lub elementu członkowskiego pola do wywołania.
-lub-
Pusty ciąg ("") wywołujący domyślny element członkowski.
-lub-
W przypadku IDispatch
elementów członkowskich ciąg reprezentujący identyfikator DispID, na przykład "[DispID=3]".
- invokeAttr
- BindingFlags
Bitowa kombinacja wartości wyliczenia, które określają sposób przeprowadzania wyszukiwania. Dostęp może być jednym z takich elementów BindingFlags
jak Public
, NonPublic
, Private
, InvokeMethod
, , GetField
i tak dalej. Nie trzeba określać typu odnośnika. Jeśli typ wyszukiwania zostanie pominięty, BindingFlags.Public
| | BindingFlags.Instance
BindingFlags.Static
są używane.
- binder
- Binder
Obiekt, który określa zestaw właściwości i umożliwia powiązanie, które może obejmować wybór metody przeciążonej, wymuszanie typów argumentu i wywołanie elementu członkowskiego przez odbicie.
-lub-
Odwołanie o wartości null (Nothing
w Visual Basic) do używania elementu DefaultBinder. Należy pamiętać, że jawne zdefiniowanie Binder obiektu może być wymagane do pomyślnego wywołania przeciążeń metody z argumentami zmiennych.
- target
- Object
Obiekt, na którym ma być wywoływany określony element członkowski.
- args
- Object[]
Tablica zawierająca argumenty, które mają być przekazywane do elementu członkowskiego do wywołania.
Zwraca
Obiekt reprezentujący zwracaną wartość wywoływanego elementu członkowskiego.
Implementuje
Wyjątki
invokeAttr
nie zawiera CreateInstance
i name
ma wartość null
.
invokeAttr
nie jest prawidłowym BindingFlags atrybutem.
-lub-
invokeAttr
nie zawiera jednej z następujących flag powiązania: InvokeMethod
, , CreateInstance
, GetField
SetField
, GetProperty
lub SetProperty
.
-lub-
invokeAttr
zawiera CreateInstance
w połączeniu z InvokeMethod
, GetField
, SetField
, GetProperty
, lub SetProperty
.
-lub-
invokeAttr
zawiera zarówno elementy , jak GetField
i SetField
.
-lub-
invokeAttr
zawiera zarówno elementy , jak GetProperty
i SetProperty
.
-lub-
invokeAttr
zawiera InvokeMethod
ciąg w połączeniu z parametrami SetField
lub SetProperty
.
-lub-
invokeAttr
element zawiera SetField
element i args
zawiera więcej niż jeden element.
-lub-
Ta metoda jest wywoływana w obiekcie COM i nie przekazano jednej z następujących flag powiązania: BindingFlags.InvokeMethod
, , BindingFlags.GetProperty
BindingFlags.SetProperty
, BindingFlags.PutDispProperty
lub BindingFlags.PutRefDispProperty
.
-lub-
Jedna z nazwanych tablic parametrów zawiera ciąg o nazwie null
.
Określony element członkowski jest inicjatorem klasy.
Nie można odnaleźć pola lub właściwości.
Nie można odnaleźć metody zgodnej z argumentami w pliku args
.
-lub-
Bieżący Type obiekt reprezentuje typ, który zawiera parametry typu otwartego, czyli ContainsGenericParameters zwraca wartość true
.
Nie można wywołać określonego elementu członkowskiego w elemencie target
.
Więcej niż jedna metoda jest zgodna z kryteriami powiązania.
Program .NET Compact Framework nie obsługuje obecnie tej metody.
Metoda reprezentowana przez program name
ma co najmniej jeden nieokreślony parametr typu ogólnego. Oznacza to, że właściwość metody ContainsGenericParameters zwraca wartość true
.
Przykłady
W poniższym przykładzie użyto InvokeMember
metody uzyskiwania dostępu do elementów członkowskich 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
Uwagi
Uwaga
Nie można użyć InvokeMember metody do wywołania metody ogólnej.
Następujące BindingFlags flagi filtru mogą służyć do definiowania elementów członkowskich do uwzględnienia w wyszukiwaniu:
Określ
BindingFlags.Public
, aby uwzględnić członków publicznych w wyszukiwaniu.Określ
BindingFlags.NonPublic
, aby uwzględnić w wyszukiwaniu niepublice elementy członkowskie (czyli prywatne i chronione elementy członkowskie).Określ
BindingFlags.FlattenHierarchy
, aby uwzględnić statyczne elementy członkowskie w górę hierarchii.
Następujące BindingFlags flagi modyfikatora mogą służyć do zmiany sposobu działania wyszukiwania:
BindingFlags.IgnoreCase
aby zignorować przypadek .name
BindingFlags.DeclaredOnly
aby wyszukać tylko elementy członkowskie zadeklarowane w elemecie Type, a nie na elementach członkowskich, które zostały po prostu odziedziczone.
BindingFlags Następujące flagi wywołania mogą służyć do określenia akcji do wykonania z elementem członkowskim:
CreateInstance
w celu wywołania konstruktora. Parametrname
jest ignorowany. Nieprawidłowy z innymi flagami wywołania.InvokeMethod
aby wywołać metodę, ale nie konstruktora lub inicjatora typu. Nieprawidłowy dla poleceniaSetField
lubSetProperty
. JeśliInvokeMethod
jest określony przez siebie,BindingFlags.Public
,BindingFlags.Instance
iBindingFlags.Static
są automatycznie dołączane.GetField
aby uzyskać wartość pola. Nieprawidłowy z .SetField
SetField
, aby ustawić wartość pola. Nieprawidłowy z .GetField
GetProperty
aby uzyskać właściwość. Nieprawidłowy z .SetProperty
SetProperty
, aby ustawić właściwość. Nieprawidłowy z .GetProperty
Aby uzyskać więcej informacji, zobacz System.Reflection.BindingFlags.
Metoda zostanie wywołana, jeśli oba następujące warunki są spełnione:
Liczba parametrów w deklaracji metody jest równa liczbie argumentów w
args
tablicy (chyba że argumenty domyślne są zdefiniowane w elemencie członkowskim iBindingFlags.OptionalParamBinding
jest określony).Typ każdego argumentu można przekonwertować przez binder na typ parametru.
Binder znajdzie wszystkie pasujące metody. Te metody można znaleźć na podstawie typu żądanego powiązania (BindingFlags wartości InvokeMethod
, GetProperty
itd.). Zestaw metod jest filtrowany według nazwy, liczby argumentów i zestawu modyfikatorów wyszukiwania zdefiniowanych w binderze.
Po wybraniu metody zostanie ona wywołana. Dostępność jest sprawdzana w tym momencie. Wyszukiwanie może kontrolować, który zestaw metod jest przeszukiwany na podstawie atrybutu ułatwień dostępu skojarzonego z metodą . Metoda Binder.BindToMethodBinder klasy jest odpowiedzialna za wybranie metody do wywołania. Domyślny binder wybiera najbardziej konkretne dopasowanie.
Ograniczenia dostępu są ignorowane dla w pełni zaufanego kodu; oznacza to, że dostęp do prywatnych konstruktorów, metod, pól i właściwości można uzyskiwać i wywoływać za pośrednictwem System.Reflection każdego, gdy kod jest w pełni zaufany.
Możesz użyć Type.InvokeMember
polecenia , aby ustawić pole na określoną wartość, określając wartość BindingFlags.SetField. Jeśli na przykład chcesz ustawić pole wystąpienia publicznego o nazwie F w klasie C, a F to String
, możesz użyć kodu takiego jak:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {"strings new value"});
Jeśli język F to String[]
, możesz użyć kodu, takiego jak:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {new String[]{"a","z","c","d"}});
co spowoduje zainicjowanie pola F do tej nowej tablicy. Można również użyć Type.InvokeMember
polecenia , aby ustawić pozycję w tablicy, podając indeks wartości, a następnie następną wartość przy użyciu kodu, takiego jak:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {1, "b"});
Spowoduje to zmianę ciągu "z" w tablicy, która zawiera ciąg "b".
Podczas wywoływania IDispatch
elementu członkowskiego można określić identyfikator DispID zamiast nazwy elementu członkowskiego przy użyciu formatu ciągu "[DispID=##]". Jeśli na przykład identyfikator DispID elementu MyComMethod ma wartość 3, możesz określić ciąg "[DispID=3]" zamiast "MyComMethod". Wywoływanie elementu członkowskiego przez DispID jest szybsze niż wyszukanie elementu członkowskiego według nazwy. W złożonych scenariuszach agregacji identyfikator DispID jest czasami jedynym sposobem wywoływania żądanego elementu członkowskiego.
Uwaga
Począwszy od .NET Framework 2.0 z dodatkiem Service Pack 1, ta metoda może służyć do uzyskiwania dostępu do niepublizowanych elementów członkowskich, jeśli obiekt wywołujący otrzymał ReflectionPermissionReflectionPermissionFlag.RestrictedMemberAccess flagę, a zestaw dotacji niepublizowanych członków jest ograniczony do zestawu dotacji osoby wywołującej lub jego podzbioru. (Zobacz Zagadnienia dotyczące zabezpieczeń do odbicia).
Aby korzystać z tej funkcji, aplikacja powinna być docelowa dla .NET Framework 3.5 lub nowszej.
Zobacz też
- String
- Binder
- DefaultBinder
- BindingFlags
- ParameterModifier
- ParameterAttributes
- CultureInfo
- ReflectionPermission
Dotyczy
InvokeMember(String, BindingFlags, Binder, Object, Object[], CultureInfo)
- Źródło:
- Type.cs
- Źródło:
- Type.cs
- Źródło:
- Type.cs
Wywołuje określony element członkowski przy użyciu określonych ograniczeń powiązania i dopasowywania określonej listy argumentów i kultury.
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
Ciąg zawierający nazwę konstruktora, metody, właściwości lub elementu członkowskiego pola do wywołania.
-lub-
Pusty ciąg ("") do wywołania domyślnego elementu członkowskiego.
-lub-
W przypadku IDispatch
elementów członkowskich ciąg reprezentujący identyfikator DispID, na przykład "[DispID=3]".
- invokeAttr
- BindingFlags
Bitowa kombinacja wartości wyliczenia, które określają sposób przeprowadzania wyszukiwania. Dostęp może być jednym z BindingFlags
takich elementów jak Public
, NonPublic
, Private
, InvokeMethod
, , GetField
i tak dalej. Nie trzeba określać typu odnośnika. Jeśli typ odnośnika zostanie pominięty, BindingFlags.Public
| | BindingFlags.Instance
BindingFlags.Static
są używane.
- binder
- Binder
Obiekt, który określa zestaw właściwości i umożliwia powiązanie, które może obejmować wybór metody przeciążonej, wymuszanie typów argumentu i wywołanie elementu członkowskiego przez odbicie.
-lub-
Odwołanie o wartości null (Nothing
w Visual Basic) do używania elementu DefaultBinder. Należy pamiętać, że jawne zdefiniowanie Binder obiektu może być wymagane do pomyślnego wywołania przeciążeń metody z argumentami zmiennych.
- target
- Object
Obiekt, na którym ma wywołać określony element członkowski.
- args
- Object[]
Tablica zawierająca argumenty, które mają być przekazywane do elementu członkowskiego do wywołania.
- culture
- CultureInfo
Obiekt reprezentujący ustawienia regionalne globalizacji do użycia, które mogą być niezbędne do konwersji specyficznych dla ustawień regionalnych, takich jak konwertowanie liczb String na wartość Double.
-lub-
Odwołanie o wartości null (Nothing
w Visual Basic) do używania bieżącego wątku CultureInfo.
Zwraca
Obiekt reprezentujący zwracaną wartość wywoływanego elementu członkowskiego.
Implementuje
Wyjątki
invokeAttr
nie zawiera CreateInstance
i name
ma wartość null
.
invokeAttr
nie jest prawidłowym BindingFlags atrybutem.
-lub-
invokeAttr
nie zawiera jednej z następujących flag powiązania: InvokeMethod
, , CreateInstance
GetField
, SetField
, GetProperty
lub SetProperty
.
-lub-
invokeAttr
zawiera w CreateInstance
połączeniu z InvokeMethod
, , GetField
, SetField
, GetProperty
lub SetProperty
.
-lub-
invokeAttr
zawiera zarówno , jak GetField
i SetField
.
-lub-
invokeAttr
zawiera zarówno , jak GetProperty
i SetProperty
.
-lub-
invokeAttr
zawiera InvokeMethod
w połączeniu z parametrem SetField
lub SetProperty
.
-lub-
invokeAttr
zawiera SetField
i args
ma więcej niż jeden element.
-lub-
Ta metoda jest wywoływana w obiekcie COM i jedna z następujących flag powiązania nie została przekazana w: BindingFlags.InvokeMethod
, , BindingFlags.GetProperty
BindingFlags.SetProperty
, , BindingFlags.PutDispProperty
lub BindingFlags.PutRefDispProperty
.
-lub-
Jedna z nazwanych tablic parametrów zawiera ciąg o nazwie null
.
Określony element członkowski jest inicjatorem klasy.
Nie można odnaleźć pola lub właściwości.
Nie można odnaleźć metody zgodnej z argumentami w elemecie args
.
-lub-
Bieżący Type obiekt reprezentuje typ, który zawiera parametry typu otwartego, czyli ContainsGenericParameters zwraca wartość true
.
Nie można wywołać określonego elementu członkowskiego w elemencie target
.
Więcej niż jedna metoda jest zgodna z kryteriami powiązania.
Metoda reprezentowana przez name
element ma co najmniej jeden nieokreślony parametr typu ogólnego. Oznacza to, że właściwość metody ContainsGenericParameters zwraca true
wartość .
Uwagi
Chociaż domyślny binder nie przetwarza CultureInfo ( culture
parametr), można użyć klasy abstrakcyjnej System.Reflection.Binder do zapisania niestandardowego powiązania, który przetwarza culture
.
Uwaga
Nie można InvokeMember wywołać metody ogólnej.
Następujące BindingFlags flagi filtru mogą służyć do definiowania elementów członkowskich do uwzględnienia w wyszukiwaniu:
Określ
BindingFlags.Public
, aby uwzględnić członków publicznych w wyszukiwaniu.Określ
BindingFlags.NonPublic
, aby uwzględnić niepublizowanych członków (czyli prywatnych, wewnętrznych i chronionych) w wyszukiwaniu.Określ
BindingFlags.FlattenHierarchy
, aby uwzględnić statyczne elementy członkowskie w hierarchii.
Następujące BindingFlags flagi modyfikatora mogą służyć do zmiany sposobu działania wyszukiwania:
BindingFlags.IgnoreCase
aby zignorować przypadek .name
BindingFlags.DeclaredOnly
aby przeszukać tylko elementy członkowskie zadeklarowane w obiekcie Type, a nie na elementach członkowskich, które zostały po prostu odziedziczone.
BindingFlags Następujące flagi wywołania mogą służyć do określenia akcji, która ma zostać zastosowana do elementu członkowskiego:
CreateInstance
aby wywołać konstruktor. Parametrname
jest ignorowany. Nieprawidłowa z innymi flagami wywołania.InvokeMethod
wywołać metodę, ale nie konstruktora lub inicjatora typu. Nieprawidłowa wartość z ciągiemSetField
lubSetProperty
. JeśliInvokeMethod
jest określony przez siebie,BindingFlags.Public
,BindingFlags.Instance
iBindingFlags.Static
są automatycznie dołączane.GetField
aby uzyskać wartość pola. Nieprawidłowa wartość w plikuSetField
.SetField
aby ustawić wartość pola. Nieprawidłowa wartość w plikuGetField
.GetProperty
aby uzyskać właściwość. Nieprawidłowa wartość w plikuSetProperty
.SetProperty
aby ustawić właściwość. Nieprawidłowa wartość w plikuGetProperty
.
Aby uzyskać więcej informacji, zobacz System.Reflection.BindingFlags.
Metoda zostanie wywołana, jeśli oba następujące warunki są spełnione:
Liczba parametrów w deklaracji metody jest równa liczbie argumentów w
args
tablicy (chyba że argumenty domyślne są zdefiniowane w elemencie członkowskim iBindingFlags.OptionalParamBinding
jest określony).Typ każdego argumentu można przekonwertować przez binder na typ parametru.
Binder znajdzie wszystkie pasujące metody. Te metody można znaleźć na podstawie typu żądanego powiązania (BindingFlags wartości InvokeMethod
, GetProperty
itd.). Zestaw metod jest filtrowany według nazwy, liczby argumentów i zestawu modyfikatorów wyszukiwania zdefiniowanych w binderze.
Po wybraniu metody jest wywoływana. Dostępność jest sprawdzana w tym momencie. Wyszukiwanie może kontrolować, który zestaw metod jest wyszukiwany na podstawie atrybutu ułatwień dostępu skojarzonego z metodą. Metoda Binder.BindToMethodBinder klasy jest odpowiedzialna za wybranie metody do wywołania. Domyślny binder wybiera najbardziej specyficzne dopasowanie.
Ograniczenia dostępu są ignorowane dla w pełni zaufanego kodu; to znaczy, prywatne konstruktory, metody, pola i właściwości mogą być dostępne i wywoływane za pośrednictwem odbicia, gdy kod jest w pełni zaufany.
Możesz użyć Type.InvokeMember
polecenia , aby ustawić pole na określoną wartość, określając BindingFlags.SetFieldwartość . Jeśli na przykład chcesz ustawić pole wystąpienia publicznego o nazwie F w klasie C, a F to String
kod, taki jak:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {"strings new value"}, null);
Jeśli język F to String[]
, możesz użyć kodu, takiego jak:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {new String[]{"a","z","c","d"}}, null);
które zainicjuje pole F do tej nowej tablicy. Można również użyć Type.InvokeMember
polecenia , aby ustawić pozycję w tablicy, podając indeks wartości, a następnie następną wartość przy użyciu kodu, takiego jak:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {1, "b"}, null);
Spowoduje to zmianę ciągu "z" w tablicy, która zawiera ciąg "b".
Po wywołaniu IDispatch
elementu członkowskiego można określić identyfikator DispID zamiast nazwy elementu członkowskiego, używając formatu ciągu "[DispID=##]". Jeśli na przykład identyfikator DispID elementu MyComMethod ma wartość 3, możesz określić ciąg "[DispID=3]" zamiast "MyComMethod". Wywołanie elementu członkowskiego przez dispID jest szybsze niż wyszukanie elementu członkowskiego według nazwy. W złożonych scenariuszach agregacji identyfikator DispID jest czasami jedynym sposobem wywoływania żądanego elementu członkowskiego.
Uwaga
Począwszy od .NET Framework 2.0 z dodatkiem Service Pack 1, ta metoda może służyć do uzyskiwania dostępu do niepublizowanych elementów członkowskich, jeśli obiekt wywołujący otrzymał ReflectionPermissionReflectionPermissionFlag.RestrictedMemberAccess flagę, a zestaw dotacji niepublizowanych członków jest ograniczony do zestawu dotacji osoby wywołującej lub jego podzbioru. (Zobacz Zagadnienia dotyczące zabezpieczeń do odbicia).
Aby korzystać z tej funkcji, aplikacja powinna być docelowa dla .NET Framework 3.5 lub nowszej.
Zobacz też
- String
- Binder
- DefaultBinder
- BindingFlags
- ParameterModifier
- ParameterAttributes
- CultureInfo
- ReflectionPermission
Dotyczy
InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[])
- Źródło:
- Type.cs
- Źródło:
- Type.cs
- Źródło:
- Type.cs
W przypadku zastąpienia w klasie pochodnej wywołuje określony element członkowski, używając określonych ograniczeń powiązań i pasujących do określonej listy argumentów, modyfikatorów i kultury.
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
Ciąg zawierający nazwę konstruktora, metody, właściwości lub elementu członkowskiego pola do wywołania.
-lub-
Pusty ciąg ("") do wywołania domyślnego elementu członkowskiego.
-lub-
W przypadku IDispatch
elementów członkowskich ciąg reprezentujący identyfikator DispID, na przykład "[DispID=3]".
- invokeAttr
- BindingFlags
Bitowa kombinacja wartości wyliczenia, które określają sposób przeprowadzania wyszukiwania. Dostęp może być jednym z BindingFlags
takich elementów jak Public
, NonPublic
, Private
, InvokeMethod
, , GetField
i tak dalej. Nie trzeba określać typu odnośnika. Jeśli typ odnośnika zostanie pominięty, BindingFlags.Public
| | BindingFlags.Instance
BindingFlags.Static
są używane.
- binder
- Binder
Obiekt, który określa zestaw właściwości i umożliwia powiązanie, które może obejmować wybór metody przeciążonej, wymuszanie typów argumentu i wywołanie elementu członkowskiego przez odbicie.
-lub-
Odwołanie o wartości null (Nic w Visual Basic) do używania elementu DefaultBinder. Należy pamiętać, że jawne zdefiniowanie Binder obiektu może być wymagane do pomyślnego wywołania przeciążeń metody z argumentami zmiennych.
- target
- Object
Obiekt, na którym ma wywołać określony element członkowski.
- args
- Object[]
Tablica zawierająca argumenty, które mają być przekazywane do elementu członkowskiego do wywołania.
- modifiers
- ParameterModifier[]
Tablica ParameterModifier obiektów reprezentujących atrybuty skojarzone z odpowiednim elementem w tablicy args
. Skojarzone atrybuty parametru są przechowywane w podpisie członka.
Domyślny binder przetwarza ten parametr tylko podczas wywoływania składnika COM.
- culture
- CultureInfo
CultureInfo Obiekt reprezentujący ustawienia regionalne globalizacji do użycia, które mogą być konieczne w przypadku konwersji specyficznych dla ustawień regionalnych, takich jak konwertowanie ciągu liczbowego na wartość Podwójna.
-lub-
Odwołanie o wartości null (Nothing
w Visual Basic) do używania bieżącego wątku CultureInfo.
- namedParameters
- String[]
Tablica zawierająca nazwy parametrów, do których przekazywane są wartości w tablicy args
.
Zwraca
Obiekt reprezentujący zwracaną wartość wywoływanego elementu członkowskiego.
Implementuje
Wyjątki
invokeAttr
nie zawiera CreateInstance
i name
ma wartość null
.
args
i modifiers
nie mają tej samej długości.
-lub-
invokeAttr
nie jest prawidłowym BindingFlags atrybutem.
-lub-
invokeAttr
nie zawiera jednej z następujących flag powiązania: InvokeMethod
, , CreateInstance
GetField
, SetField
, GetProperty
lub SetProperty
.
-lub-
invokeAttr
zawiera w CreateInstance
połączeniu z InvokeMethod
, , GetField
, SetField
, GetProperty
lub SetProperty
.
-lub-
invokeAttr
zawiera zarówno , jak GetField
i SetField
.
-lub-
invokeAttr
zawiera zarówno , jak GetProperty
i SetProperty
.
-lub-
invokeAttr
zawiera InvokeMethod
w połączeniu z parametrem SetField
lub SetProperty
.
-lub-
invokeAttr
zawiera SetField
i args
ma więcej niż jeden element.
-lub-
Nazwana tablica parametrów jest większa niż tablica argumentów.
-lub-
Ta metoda jest wywoływana w obiekcie COM i jedna z następujących flag powiązania nie została przekazana w: BindingFlags.InvokeMethod
, , BindingFlags.GetProperty
BindingFlags.SetProperty
, , BindingFlags.PutDispProperty
lub BindingFlags.PutRefDispProperty
.
-lub-
Jedna z nazwanych tablic parametrów zawiera ciąg o nazwie null
.
Określony element członkowski jest inicjatorem klasy.
Nie można odnaleźć pola lub właściwości.
Nie można odnaleźć metody zgodnej z argumentami w elemecie args
.
-lub-
Nie można odnaleźć elementu członkowskiego z nazwami argumentów podanymi w elemencie namedParameters
.
-lub-
Bieżący Type obiekt reprezentuje typ, który zawiera parametry typu otwartego, czyli ContainsGenericParameters zwraca wartość true
.
Nie można wywołać określonego elementu członkowskiego w elemencie target
.
Więcej niż jedna metoda jest zgodna z kryteriami powiązania.
Metoda reprezentowana przez name
element ma co najmniej jeden nieokreślony parametr typu ogólnego. Oznacza to, że właściwość metody ContainsGenericParameters zwraca true
wartość .
Uwagi
InvokeMember
wywołuje składową konstruktora lub składową metody, pobiera lub ustawia element członkowski właściwości, pobiera lub ustawia element elementu członkowskiego pola danych albo pobiera lub ustawia element składowej tablicy.
Uwaga
Nie można InvokeMember wywołać metody ogólnej.
Po wywołaniu IDispatch
elementu członkowskiego można określić identyfikator DispID zamiast nazwy elementu członkowskiego, używając formatu ciągu "[DispID=##]". Jeśli na przykład identyfikator DispID elementu MyComMethod ma wartość 3, możesz określić ciąg "[DispID=3]" zamiast "MyComMethod". Wywołanie elementu członkowskiego przez dispID jest szybsze niż wyszukanie elementu członkowskiego według nazwy. W złożonych scenariuszach agregacji identyfikator DispID jest czasami jedynym sposobem wywoływania żądanego elementu członkowskiego.
Mimo że domyślny binder nie przetwarza ParameterModifier lub CultureInfo (parametry modifiers
i culture
), można użyć klasy abstrakcyjnej System.Reflection.Binder do zapisania niestandardowego powiązania, który przetwarza modifiers
i culture
.
ParameterModifier
jest używany tylko podczas wywoływania międzyoperacyjności MODELU COM, a obsługiwane są tylko parametry przekazywane przez odwołanie.
Każdy parametr w tablicy namedParameters
pobiera wartość w odpowiednim elemecie w tablicy args
. Jeśli długość parametru args
jest większa niż długość , pozostałe wartości argumentów namedParameters
są przekazywane w kolejności.
Tablica namedParameters
może służyć do zmiany kolejności argumentów w tablicy wejściowej. Na przykład, biorąc pod uwagę metodę M(string a, int b)
(M(ByVal a As String, ByVal b As Integer)
w Visual Basic) i tablicę { 42, "x" }
wejściową , tablica wejściowa może zostać przekazana bez zmian, args
jeśli tablica { "b", "a" }
jest dostarczana dla namedParameters
.
Następujące BindingFlags flagi filtru mogą służyć do definiowania elementów członkowskich do uwzględnienia w wyszukiwaniu:
Określ
BindingFlags.Public
, aby uwzględnić członków publicznych w wyszukiwaniu.Określ
BindingFlags.NonPublic
, aby uwzględnić niepublizowanych członków (czyli prywatnych, wewnętrznych i chronionych) w wyszukiwaniu.Określ
BindingFlags.FlattenHierarchy
, aby uwzględnić statyczne elementy członkowskie w hierarchii.
Następujące BindingFlags flagi modyfikatora mogą służyć do zmiany sposobu działania wyszukiwania:
BindingFlags.IgnoreCase
aby zignorować przypadek .name
BindingFlags.DeclaredOnly
aby przeszukać tylko elementy członkowskie zadeklarowane w obiekcie Type, a nie na elementach członkowskich, które zostały po prostu odziedziczone.
BindingFlags Następujące flagi wywołania mogą służyć do określenia akcji, która ma zostać zastosowana do elementu członkowskiego:
CreateInstance
aby wywołać konstruktor. Parametrname
jest ignorowany. Nieprawidłowa z innymi flagami wywołania.InvokeMethod
wywołać metodę, ale nie konstruktora lub inicjatora typu. Nieprawidłowa wartość z ciągiemSetField
lubSetProperty
. JeśliInvokeMethod
jest określony przez siebie,BindingFlags.Public
,BindingFlags.Instance
iBindingFlags.Static
są automatycznie dołączane.GetField
aby uzyskać wartość pola. Nieprawidłowa wartość w plikuSetField
.SetField
aby ustawić wartość pola. Nieprawidłowa wartość w plikuGetField
.GetProperty
aby uzyskać właściwość. Nieprawidłowa wartość w plikuSetProperty
.SetProperty
aby ustawić właściwość. Nieprawidłowa wartość w plikuGetProperty
.
Aby uzyskać więcej informacji, zobacz System.Reflection.BindingFlags.
Metoda zostanie wywołana, jeśli oba następujące warunki są spełnione:
Liczba parametrów w deklaracji metody jest równa liczbie argumentów w
args
tablicy (chyba że argumenty domyślne są zdefiniowane w elemencie członkowskim iBindingFlags.OptionalParamBinding
jest określony).Typ każdego argumentu można przekonwertować przez binder na typ parametru.
Binder znajdzie wszystkie pasujące metody. Te metody można znaleźć na podstawie typu żądanego powiązania (BindingFlags wartości InvokeMethod
, GetProperty
itd.). Zestaw metod jest filtrowany według nazwy, liczby argumentów i zestawu modyfikatorów wyszukiwania zdefiniowanych w binderze.
Po wybraniu metody jest wywoływana. Dostępność jest sprawdzana w tym momencie. Wyszukiwanie może kontrolować, który zestaw metod jest wyszukiwany na podstawie atrybutu ułatwień dostępu skojarzonego z metodą. Metoda Binder.BindToMethodBinder klasy jest odpowiedzialna za wybranie metody do wywołania. Domyślny binder wybiera najbardziej specyficzne dopasowanie.
InvokeMember
może służyć do wywoływania metod z parametrami, które mają wartości domyślne. Aby powiązać z tymi metodami, należy BindingFlags.OptionalParamBinding określić odbicie. W przypadku parametru, który ma wartość domyślną, możesz podać inną wartość lub podać wartość Missing.Value domyślną.
Rozważmy na przykład metodę, taką jak MyMethod(int x, float y = 2.0). Aby wywołać tę metodę tylko z pierwszym argumentem jako MyMethod(4), przekaż jedną z powyższych flag powiązania i przekaż dwa argumenty, a mianowicie 4 dla pierwszego argumentu i Missing.Value
drugiego argumentu. Jeśli nie używasz metody Missing.Value
, nie można pominąć parametrów opcjonalnych za pomocą Invoke
metody . Jeśli musisz to zrobić, użyj InvokeMember
zamiast tego.
Ograniczenia dostępu są ignorowane dla w pełni zaufanego kodu; to znaczy, prywatne konstruktory, metody, pola i właściwości mogą być dostępne i wywoływane za pośrednictwem System.Reflection każdego, gdy kod jest w pełni zaufany.
Możesz użyć Type.InvokeMember
polecenia , aby ustawić pole na określoną wartość, określając BindingFlags.SetFieldwartość . Jeśli na przykład chcesz ustawić pole wystąpienia publicznego o nazwie F w klasie C, a F to String
, możesz użyć kodu, takiego jak:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {"strings new value"}, null, null, null);
Jeśli język F to String[]
, możesz użyć kodu, takiego jak:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {new String[]{"a","z","c","d"}}, null, null, null);
które zainicjuje pole F do tej nowej tablicy. Można również użyć Type.InvokeMember
polecenia , aby ustawić pozycję w tablicy, podając indeks wartości, a następnie następną wartość przy użyciu kodu, takiego jak:
typeof(C).InvokeMember("F", BindingFlags.SetField, null, c, new Object[] {1, "b"}, null, null, null);
Spowoduje to zmianę ciągu "z" w tablicy, która zawiera ciąg "b".
Uwaga
Począwszy od .NET Framework 2.0 z dodatkiem Service Pack 1, ta metoda może służyć do uzyskiwania dostępu do niepublizowanych elementów członkowskich, jeśli obiekt wywołujący otrzymał ReflectionPermissionReflectionPermissionFlag.RestrictedMemberAccess flagę, a zestaw dotacji niepublizowanych członków jest ograniczony do zestawu dotacji osoby wywołującej lub jego podzbioru. (Zobacz Zagadnienia dotyczące zabezpieczeń do odbicia).
Aby korzystać z tej funkcji, aplikacja powinna być docelowa dla .NET Framework 3.5 lub nowszej.
Zobacz też
- String
- Binder
- DefaultBinder
- BindingFlags
- ParameterModifier
- ParameterAttributes
- CultureInfo
- ReflectionPermission