2012-01-08 21 views
33

MethodInfo.Invoke ile bir parametreyi başvuru olarak nasıl geçirebilirim? Bir parametreyi MethodInfo.Invoke ile başvuru olarak geçirme

Bu

ben aramak istediğiniz yöntemdir:

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

Bu çalıştı ama başarısız oldu: döndü

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

bayt boş.

cevap

44

Önce argüman dizisini oluşturmanız ve ona bir referans tutmanız gerekir. out parametre değeri daha sonra dizide saklanır. Yani kullanabilirsiniz:

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

Not bir out parametre çünkü sen, ikinci argüman için değer sağlamak gerekmez nasıl - değeri yöntemi ile belirlenecektir. ref parametresiyse (out yerine), başlangıç ​​değeri kullanılırdı; ancak dizideki değer yine de yöntemle değiştirilebilir.

kısa fakat tam bir örneği:

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

yansıma ile çağrılan bir yöntem geri bir bağımsız değişken listesi olarak kullanılan diziye kopyalanacak bir ref parametre vardır. Kopyalanan geri referansı almak için argüman olarak kullanılan diziye bakmanız yeterlidir.

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

bu çağrı args[1] yeni byte[]

olacak sonra
İlgili konular