what tutorial net how create c# reflection methodinfo

c# - tutorial - Cómo pasar un parámetro como referencia con MethodInfo.Invoke



system reflection c# (2)

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

Este es el método que quiero llamar:

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

Intenté esto pero fallé:

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.


Cuando un método invocado por reflexión tiene un parámetro ref , se copiará nuevamente en la matriz que se utilizó como 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[]


Primero debe crear la matriz de argumentos y mantener una referencia a ella. El valor del parámetro de out se almacenará en la matriz. Entonces puedes usar:

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

Tenga en cuenta que no necesita proporcionar el valor para el segundo argumento, porque es un parámetro de out ; el valor lo establecerá el método. Si fuera un parámetro ref (en lugar de out ), entonces se usaría el valor inicial, pero el método podría seguir reemplazando el valor de la matriz.

Muestra corta pero completa:

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"; } }