web-dev-qa-db-fra.com

Comment passer un paramètre comme référence avec MethodInfo.Invoke

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.

37
method

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";
    }
}
56
Jon Skeet

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[]

12
JaredPar