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

返されるバイトは null です。

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

2 番目の引数はパラメーターであるため、値を指定する必要がないことに注意してください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 に答える