2012-01-08 31 views
33

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

返されたバイトがヌルです。

答えて

44

引数の配列を最初に作成し、その配列への参照を保持する必要があります。 outのパラメータ値が配列に格納されます。だから、使用することができます。

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

注それはoutパラメータですので、あなたは、第二引数に値を提供する必要はありませんか - 値はメソッドによって設定されます。パラメータがoutの代わりにrefの場合、初期値が使用されますが、配列の値は引き続きこのメソッドで置き換えられます。

短いが完全なサンプル:

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

反射によって呼び出されたメソッドは、それがバック引数リストとして使用された配列にコピーするrefパラメータを有しています。したがって、コピーされたバックリファレンスを取得するには、単に引数として使用される配列を調べるだけです。

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

この呼び出しargs[1]は新しいbyte[]

を持つことになります後
関連する問題