DynamicMethod.Invoke Metodo

Definizione

Richiama il metodo dinamico usando i parametri specificati, sotto i vincoli del binder specificato, con le informazioni sulle impostazioni cultura specificate.

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);
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

Parametri

obj
Object

Questo parametro viene ignorato per i metodi dinamici, perché sono statici. Specificare null.

invokeAttr
BindingFlags

Combinazione bit per bit di BindingFlags valori.

binder
Binder

Oggetto Binder che consente l'associazione, la coercizione dei tipi di argomento, la chiamata di membri e il recupero di MemberInfo oggetti tramite reflection. Se binder è null, viene usato il gestore di associazione predefinito. Per altri dettagli, vedere Binder.

parameters
Object[]

Elenco di argomenti. Si tratta di una matrice di argomenti con lo stesso numero, ordine e tipo dei parametri del metodo da richiamare. Se non sono presenti parametri, questo parametro deve essere null.

culture
CultureInfo

Istanza di CultureInfo utilizzata per gestire la coercizione dei tipi. Se è null, viene usato per CultureInfo il thread corrente. Ad esempio, queste informazioni sono necessarie per convertire correttamente un oggetto String che rappresenta 1000 in un Double valore, perché 1000 è rappresentato in modo diverso da impostazioni cultura diverse.

Valori restituiti

Oggetto Object contenente il valore restituito del metodo richiamato.

Eccezioni

La convenzione di VarArgs chiamata non è supportata.

Il numero di elementi in parameters non corrisponde al numero di parametri nel metodo dinamico.

Il tipo di uno o più elementi di parameters non corrisponde al tipo del parametro corrispondente del metodo dinamico.

Il metodo dinamico è associato a un modulo, non è ospitato in modo anonimo ed è stato costruito con skipVisibility impostato su false, ma il metodo dinamico accede ai membri che non sono public o internal (Friend in Visual Basic).

oppure

Il metodo dinamico è ospitato in modo anonimo ed è stato costruito con skipVisibility impostato su false, ma accede ai membri che non publicsono .

oppure

Il metodo dinamico contiene codice non verificabile. Vedere la sezione "Verifica" in Osservazioni per DynamicMethod.

Esempio

Nell'esempio di codice seguente viene invocato un metodo dinamico con binding esatto, utilizzando la cultura en-US. Questo esempio di codice fa parte di un esempio più ampio fornito per la DynamicMethod classe .

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)

Commenti

Oltre alle eccezioni elencate, il codice chiamante deve essere preparato per intercettare eventuali eccezioni generate dal metodo dinamico.

L'esecuzione di un metodo dinamico con un delegato creato dal CreateDelegate metodo è più efficiente rispetto all'esecuzione con il Invoke metodo .

La chiamata al Invoke metodo o al CreateDelegate metodo completa il metodo dinamico. Qualsiasi ulteriore tentativo di modificare il metodo dinamico, ad esempio la modifica delle definizioni dei parametri o l'emissione di un linguaggio MSIL (Microsoft Intermediate Language), viene ignorato; non viene generata alcuna eccezione.

Tutti i metodi dinamici sono statici, quindi il obj parametro viene sempre ignorato. Per trattare un metodo dinamico come se fosse un metodo di istanza, utilizzare l'overload CreateDelegate(Type, Object) che accetta come parametro un'istanza di un oggetto.

Se il metodo dinamico non ha parametri, il valore di parameters deve essere null. In caso contrario, il numero, il tipo e l'ordine degli elementi nella matrice di parametri devono essere identici al numero, al tipo e all'ordine dei parametri del metodo dinamico.

Annotazioni

Questo overload del metodo viene chiamato dall'overload del metodo Invoke(Object, Object[]) ereditato dalla classe MethodBase, pertanto, le precedenti osservazioni si applicano a entrambe le versioni del metodo.

Questo metodo non richiede direttamente le autorizzazioni, ma richiamare il metodo dinamico può comportare richieste di sicurezza, a seconda del metodo . Ad esempio, non vengono richieste per i metodi dinamici ospitati in modo anonimo creati con il restrictedSkipVisibility parametro impostato su false. D'altra parte, se si crea un metodo con restrictedSkipVisibility impostato su true in modo che possa accedere a un membro nascosto di un assembly di destinazione, il metodo causerà una richiesta per le autorizzazioni dell'assembly di destinazione più ReflectionPermission con il ReflectionPermissionFlag.MemberAccess flag .

Si applica a

Vedi anche