Comment passer un paramètre comme référence avec MethodInfo.Invoke
?
Voici la méthode que je veux appeler:
private static bool test(string str, out byte[] byt)
J'ai essayé mais j'ai échoué:
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
});
Les octets retournés sont nuls.
Vous devez d'abord créer le tableau d'arguments et y conserver une référence. La valeur du paramètre out
sera alors stockée dans le tableau. Vous pouvez donc utiliser:
object[] arguments = new object[] { "test", null };
MethodInfo method = ...;
bool b = (bool) method.Invoke(null, arguments);
byte[] rawAsm = (byte[]) arguments[1];
Notez que vous n'avez pas besoin de fournir la valeur du deuxième argument, car il s'agit d'un paramètre out
- la valeur sera définie par la méthode. S'il s'agissait d'un paramètre ref
(au lieu de out
), la valeur initiale serait utilisée - mais la valeur dans le tableau pourrait toujours être remplacée par la méthode.
Échantillon court mais complet:
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";
}
}
Lorsqu'une méthode invoquée par réflexion a un paramètre ref
, elle sera recopiée dans le tableau qui a été utilisé comme liste d'arguments. Donc, pour obtenir la référence copiée, il vous suffit de regarder le tableau utilisé comme arguments.
object[] args = new [] { "test", rawAsm };
bool b = (bool)_lf.Invoke(null, args);
Après cet appel args[1]
aura le nouveau byte[]