Udostępnij za pośrednictwem


DynamicMethod.Invoke Metoda

Definicja

Wywołuje metodę dynamiczną przy użyciu określonych parametrów w ramach ograniczeń określonego powiązania z określonymi informacjami o kulturze.

public:
 override System::Object ^ Invoke(System::Object ^ obj, System::Reflection::BindingFlags invokeAttr, System::Reflection::Binder ^ binder, cli::array <System::Object ^> ^ parameters, System::Globalization::CultureInfo ^ culture);
public override object? Invoke (object? obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder? binder, object?[]? parameters, System.Globalization.CultureInfo? culture);
public override object Invoke (object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, object[] parameters, System.Globalization.CultureInfo culture);
override this.Invoke : obj * System.Reflection.BindingFlags * System.Reflection.Binder * obj[] * System.Globalization.CultureInfo -> obj
Public Overrides Function Invoke (obj As Object, invokeAttr As BindingFlags, binder As Binder, parameters As Object(), culture As CultureInfo) As Object

Parametry

obj
Object

Ten parametr jest ignorowany dla metod dynamicznych, ponieważ są statyczne. Podaj wartość null.

invokeAttr
BindingFlags

Bitowa kombinacja BindingFlags wartości.

binder
Binder

Binder Obiekt, który umożliwia powiązanie, przymus typów argumentów, wywołanie elementów członkowskich i pobieranie MemberInfo obiektów przez odbicie. Jeśli binder parametr ma nullwartość , jest używany domyślny binder. Aby uzyskać więcej informacji, zobacz: .

parameters
Object[]

Lista argumentów. Jest to tablica argumentów o tej samej liczbie, kolejności i typie, co parametry metody do wywołania. Jeśli nie ma parametrów, ten parametr powinien mieć wartość null.

culture
CultureInfo

Wystąpienie używane do nadzorowania CultureInfo przymusu typów. Jeśli jest nullto wartość , CultureInfo używany jest element dla bieżącego wątku. Na przykład te informacje są potrzebne do poprawnego przekonwertowania elementu reprezentującego StringDouble wartość 1000 na wartość, ponieważ 1000 jest reprezentowane inaczej przez różne kultury.

Zwraca

Element Object zawierający wartość zwracaną wywołanej metody.

Wyjątki

Konwencja wywoływania nie jest obsługiwana VarArgs .

Liczba elementów w elemecie parameters nie jest zgodna z liczbą parametrów w metodzie dynamicznej.

Typ co najmniej jednego elementu parameters nie jest zgodny z typem odpowiedniego parametru metody dynamicznej.

Metoda dynamiczna jest skojarzona z modułem, nie jest hostowana anonimowo i została utworzona z ustawioną wartością skipVisibilityfalse, ale metoda dynamiczna uzyskuje dostęp do elementów członkowskich, które nie public są lub internal (Friend w Visual Basic).

-lub-

Metoda dynamiczna jest hostowana anonimowo i została utworzona z ustawioną wartością skipVisibilityfalse, ale uzyskuje dostęp do elementów członkowskich, które nie publicsą .

-lub-

Metoda dynamiczna zawiera nieweryfikowalny kod. Zobacz sekcję "Weryfikacja" w uwagach dotyczących DynamicMethodelementu .

Przykłady

Poniższy przykład kodu wywołuje metodę dynamiczną z dokładnym powiązaniem przy użyciu kultury US-English. Ten przykład kodu jest częścią większego przykładu udostępnionego DynamicMethod dla klasy .

Console::WriteLine("\r\nUse the Invoke method to execute the dynamic method:");
// Create an array of arguments to use with the Invoke method.
array<Object^>^ invokeArgs = { "\r\nHello, World!", 42 };
// Invoke the dynamic method using the arguments. This is much
// slower than using the delegate, because you must create an
// array to contain the arguments, and value-type arguments
// must be boxed.
Object^ objRet = hello->Invoke(nullptr, BindingFlags::ExactBinding, nullptr, invokeArgs, gcnew CultureInfo("en-us"));
Console::WriteLine("hello.Invoke returned: " + objRet);
Console.WriteLine("\r\nUse the Invoke method to execute the dynamic method:");
// Create an array of arguments to use with the Invoke method.
object[] invokeArgs = {"\r\nHello, World!", 42};
// Invoke the dynamic method using the arguments. This is much
// slower than using the delegate, because you must create an
// array to contain the arguments, and value-type arguments
// must be boxed.
object objRet = hello.Invoke(null, BindingFlags.ExactBinding, null, invokeArgs, new CultureInfo("en-us"));
Console.WriteLine("hello.Invoke returned: " + objRet);
Console.WriteLine(vbCrLf & "Use the Invoke method to execute the dynamic method:")
' Create an array of arguments to use with the Invoke method.
Dim invokeArgs() As Object = {vbCrLf & "Hello, World!", 42}
' Invoke the dynamic method using the arguments. This is much
' slower than using the delegate, because you must create an
' array to contain the arguments, and value-type arguments
' must be boxed.
Dim objRet As Object = hello.Invoke(Nothing, _
    BindingFlags.ExactBinding, Nothing, invokeArgs, _
    New CultureInfo("en-us"))
Console.WriteLine("hello.Invoke returned: {0}", objRet)

Uwagi

Oprócz wymienionych wyjątków kod wywołujący powinien być przygotowany do przechwytywania wyjątków zgłaszanych przez metodę dynamiczną.

Wykonywanie metody dynamicznej za pomocą delegata utworzonego CreateDelegate przez metodę jest bardziej wydajne niż wykonywanie jej za Invoke pomocą metody .

Invoke Wywołanie metody lub CreateDelegate metody kończy metodę dynamiczną. Wszelkie dalsze próby zmiany metody dynamicznej, takie jak modyfikowanie definicji parametrów lub emitowanie większej liczby języków pośrednich firmy Microsoft (MSIL), są ignorowane; nie jest zgłaszany wyjątek.

Wszystkie metody dynamiczne są statyczne, więc obj parametr jest zawsze ignorowany. Aby traktować metodę dynamiczną tak, jakby była to metoda wystąpienia, użyj CreateDelegate(Type, Object) przeciążenia, które przyjmuje wystąpienie obiektu.

Jeśli metoda dynamiczna nie ma parametrów, wartość parametru parameters powinna mieć nullwartość . W przeciwnym razie liczba, typ i kolejność elementów w tablicy parametrów powinny być identyczne z liczbą, typem i kolejnością parametrów metody dynamicznej.

Uwaga

To przeciążenie metody jest wywoływane przez Invoke(Object, Object[]) przeciążenie metody dziedziczone z MethodBase klasy, więc powyższe uwagi mają zastosowanie do obu przeciążeń.

Ta metoda nie wymaga uprawnień bezpośrednio, ale wywołanie metody dynamicznej może spowodować zapotrzebowanie na zabezpieczenia, w zależności od metody. Na przykład nie są wymagane dla anonimowo hostowanych metod dynamicznych, które są tworzone przy użyciu parametru ustawionego restrictedSkipVisibility na falsewartość . Z drugiej strony, jeśli utworzysz metodę z restrictedSkipVisibility ustawioną wartością true , aby uzyskać dostęp do ukrytego elementu członkowskiego zestawu docelowego, metoda spowoduje żądanie uprawnień zestawu docelowego plus ReflectionPermission z flagą ReflectionPermissionFlag.MemberAccess .

Uwaga

Przed .NET Framework 2.0 ta metoda jest wymagana ReflectionPermission z flagą MemberAccess .

Dotyczy

Zobacz też