Question Comment passer un paramètre en tant que référence avec MethodInfo.Invoke


Comment puis-je passer un paramètre en tant que référence avec MethodInfo.Invoke?

C'est la méthode que je veux appeler:

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

J'ai essayé ceci 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 renvoyés sont null.


34
2018-01-08 17:45


origine


Réponses:


Vous devez d'abord créer le tableau d'arguments et y faire référence. le out la valeur du paramètre sera alors stockée dans le tableau. Donc, vous pouvez 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 second argument, car il s'agit d'un out paramètre - la valeur sera définie par la méthode. Si c'était un ref paramètre (au lieu de out) alors la valeur initiale serait utilisée - mais la valeur dans le tableau pourrait encore ê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";
    }
}

46
2018-01-08 17:46



Quand une méthode invoquée par réflexion a une ref paramètre, il sera recopié dans le tableau utilisé comme liste d'arguments. Donc, pour obtenir la référence arrière copiée, il suffit de regarder le tableau utilisé comme argument.

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

Après cet appel args[1] aura le nouveau byte[] 


11
2018-01-08 17:48