45

如何将参数作为参考传递MethodInfo.Invoke

这是我要调用的方法:

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

我试过这个但我失败了:

byte[] rawAsm = new byte[]{};
MethodInfo _lf = asm.GetType().GetMethod("test", BindingFlags.Static |  BindingFlags.NonPublic);
bool b = (bool)_lf.Invoke(null, new object[]
{
    "test",
    rawAsm
});

返回的字节为空。

4

2 回答 2

69

您需要先创建参数数组,并保留对它的引用。然后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";
    }
}
于 2012-01-08T17:46:56.850 回答
16

当反射调用的方法有ref参数时,它将被复制回用作参数列表的数组中。因此,要获得复制的反向引用,您只需查看用作参数的数组。

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

在这个电话之后args[1]会有新的byte[]

于 2012-01-08T17:48:07.567 回答