2012-01-08 19 views
33

¿Cómo puedo pasar un parámetro como referencia con MethodInfo.Invoke?Cómo pasar un parámetro como referencia con MethodInfo.Invoke

Este es el método que yo quiero llamar a:

private static bool test(string str, out byte[] byt) 

He intentado esto pero fallaron:

byte[] rawAsm = new byte[]{}; 
MethodInfo _lf = asm.GetTypes()[0].GetMethod("test", BindingFlags.Static | BindingFlags.NonPublic); 
bool b = (bool)_lf.Invoke(null, new object[] 
{ 
    "test", 
    rawAsm 
}); 

Los bytes devueltos son nulos.

Respuesta

44

Primero debe crear la matriz de argumentos y mantener una referencia a la misma. El valor del parámetro out se almacenará en la matriz. Así que usted puede utilizar:

object[] arguments = new object { "test", null }; 
MethodInfo method = ...; 
bool b = (bool) method.Invoke(null, arguments); 
byte[] rawAsm = (byte[]) arguments[1]; 

Nota cómo no es necesario para proporcionar el valor para el segundo argumento, porque es un parámetro out - el valor será fijado por el método. Si fuera un parámetro ref (en lugar de out), entonces se usaría el valor inicial, pero el valor de la matriz podría reemplazarse por el método.

corto pero completo de la muestra:

using System; 
using System.Reflection; 

class Test 
{ 
    static void Main() 
    { 
     object[] arguments = new object[1]; 
     MethodInfo method = typeof(Test).GetMethod("SampleMethod"); 
     method.Invoke(null, arguments); 
     Console.WriteLine(arguments[0]); // Prints Hello 
    } 

    public static void SampleMethod(out string text) 
    { 
     text = "Hello"; 
    } 
} 
11

Cuando un método invocado por la reflexión tiene un parámetro ref se copiará de nuevo en la matriz que se utiliza como una lista de argumentos. Por lo tanto, para obtener la referencia copiada, solo tiene que mirar la matriz utilizada como argumentos.

object[] args = new [] { "test", rawAsm }; 
bool b = (bool)_lf.Invoke(null, args); 

Después de esta llamada args[1] tendrá el nuevo byte[]

Cuestiones relacionadas