Подтвердить что ты не робот

Как передать параметр в качестве ссылки в MethodInfo.Invoke

Как передать параметр в качестве ссылки с помощью MethodInfo.Invoke?

Это метод, который я хочу вызвать:

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

Я пробовал это, но я потерпел неудачу:

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

Возвращенные байты: null.

4b9b3361

Ответ 1

Сначала нужно создать массив аргументов и сохранить ссылку на него. Значение параметра out будет сохранено в массиве. Таким образом, вы можете использовать:

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

Обратите внимание, как вам не нужно указывать значение для второго аргумента, поскольку это параметр out - значение будет задано с помощью метода. Если бы это был параметр ref (вместо out), тогда было бы использовано начальное значение, но значение в массиве все равно может быть заменено методом.

Короткий, но полный образец:

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

Ответ 2

Когда метод, вызываемый отражением, имеет параметр ref, он будет скопирован обратно в массив, который использовался в качестве списка аргументов. Итак, чтобы получить скопированную обратную ссылку, вам просто нужно посмотреть на массив, используемый в качестве аргументов.

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

После этого вызова args[1] появится новый byte[]