Compartir vía


DynamicMethod.Invoke Método

Definición

Invoca el método dinámico usando los parámetros especificados, bajo las restricciones del enlazador especificado, con la información de la referencia cultural especificada.

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

Parámetros

obj
Object

Este parámetro se omite para los métodos dinámicos porque son estáticos. Especifique null.

invokeAttr
BindingFlags

Combinación bit a bit de valores BindingFlags.

binder
Binder

Objeto Binder que permite el enlace, la conversión de tipos de argumentos, la llamada de miembros y la recuperación de objetos MemberInfo mediante reflexión. Si binder es null, se usa el enlazador predeterminado. Para obtener más información, vea Binder.

parameters
Object[]

Lista de argumentos. Esta es una matriz de argumentos con el mismo número, orden y tipo que los parámetros del método al que se va a invocar. Si no hay parámetros, este parámetro debe ser null.

culture
CultureInfo

Instancia de CultureInfo usada para regir la conversión de tipos. Si es null, se utiliza CultureInfo para el subproceso actual. Por ejemplo, esta información es necesaria para convertir un tipo String que representa 1000 en un valor Double, porque 1000 se representa de maneras diferentes según la referencia cultural.

Devoluciones

Object que contiene el valor devuelto por el método invocado.

Excepciones

No se admite la convención de llamada VarArgs.

El número de parámetros de parameters no coincide con el número de parámetros del método dinámico.

El tipo de uno o varios elementos de parameters no coincide con el tipo del parámetro correspondiente del método dinámico.

El método dinámico está asociado a un módulo, no está hospedado de forma anónima y se construyó con skipVisibility establecido en false, pero el método dinámico tiene acceso a miembros que no son public o internal (Friend en Visual Basic).

o bien

El método dinámico se hospeda de forma anónima y se construyó con skipVisibility establecido en false, pero tiene acceso a miembros que no son public.

o bien

El método dinámico contiene código no comprobable. Vea la sección "Comprobación" en Comentarios para DynamicMethod.

Ejemplos

En el ejemplo de código siguiente se invoca un método dinámico con enlace exacto, mediante la referencia cultural US-English. Este ejemplo de código es parte de un ejemplo más grande proporcionado para la clase DynamicMethod.

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)

Comentarios

Además de las excepciones enumeradas, el código de llamada debe estar preparado para detectar las excepciones producidas por el método dinámico.

Ejecutar un método dinámico con un delegado creado por el CreateDelegate método es más eficaz que ejecutarlo con el Invoke método .

Al llamar al Invoke método o al CreateDelegate método se completa el método dinámico. Cualquier intento adicional de modificar el método dinámico, como modificar definiciones de parámetros o emitir más lenguaje intermedio de Microsoft (MSIL), se omite; no se produce ninguna excepción.

Todos los métodos dinámicos son estáticos, por lo que el obj parámetro siempre se omite. Para tratar un método dinámico como si fuera un método de instancia, use la CreateDelegate(Type, Object) sobrecarga que toma una instancia de objeto.

Si el método dinámico no tiene parámetros, el valor de parameters debe ser null. De lo contrario, el número, el tipo y el orden de los elementos de la matriz de parámetros deben ser idénticos al número, el tipo y el orden de los parámetros del método dinámico.

Nota

La sobrecarga de método hereda de la MethodBase clase llama Invoke(Object, Object[]) a esta sobrecarga de método, por lo que las observaciones anteriores se aplican a ambas sobrecargas.

Este método no exige permisos directamente, pero invocar el método dinámico puede dar lugar a demandas de seguridad, en función del método. Por ejemplo, no se exigen métodos dinámicos hospedados de forma anónima que se crean con el restrictedSkipVisibility parámetro establecido falseen . Por otro lado, si crea un método con restrictedSkipVisibility establecido en true para que pueda acceder a un miembro oculto de un ensamblado de destino, el método provocará una demanda de permisos del ensamblado de destino más ReflectionPermission con la ReflectionPermissionFlag.MemberAccess marca .

Nota

Antes de .NET Framework 2.0, este método era necesario ReflectionPermission con la MemberAccess marca .

Se aplica a

Consulte también