Как передать параметр в качестве ссылки с помощью MethodInfo.Взывать
Как я могу передать параметр в качестве ссылки с помощью 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
});
Возвращаемые байты равны нулю.
2 ответа:
Сначала нужно создать массив аргументов и сохранить ссылку на него. Значение параметра
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"; } }
Когда метод, вызванный отражением, имеет параметр
ref
, он будет скопирован обратно в массив, который использовался в качестве списка аргументов. Поэтому, чтобы получить скопированную обратную ссылку, вам просто нужно посмотреть на массив, используемый в качестве аргументов.object[] args = new [] { "test", rawAsm }; bool b = (bool)_lf.Invoke(null, args);
После этого вызова
args[1]
появится новыйbyte[]