2012-01-08 3 views
33

Tôi làm cách nào để chuyển tham số dưới dạng tham chiếu với MethodInfo.Invoke?Cách chuyển tham số dưới dạng tham chiếu với MethodInfo.Invoke

Đây là phương pháp tôi muốn gọi:

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

tôi đã cố gắng này, nhưng tôi đã thất bại:

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

Các byte trở lại là null.

Trả lời

44

Trước tiên, bạn cần tạo mảng đối số và giữ tham chiếu đến nó. Giá trị tham số out sau đó sẽ được lưu trữ trong mảng. Vì vậy, bạn có thể sử dụng:

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

Lưu ý làm thế nào bạn không cần phải cung cấp giá trị cho đối số thứ hai, bởi vì nó là một tham số out - giá trị sẽ được thiết lập bởi phương pháp này. Nếu đó là thông số ref (thay vì out) thì giá trị ban đầu sẽ được sử dụng - nhưng giá trị trong mảng vẫn có thể được thay thế bằng phương pháp.

ngắn nhưng đầy đủ mẫu:

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

Khi một phương pháp gọi bởi phản ánh có một tham số ref nó sẽ được sao chép lại vào mảng đã được sử dụng như một danh sách đối số. Vì vậy, để có được tham chiếu trở lại sao chép, bạn chỉ cần nhìn vào mảng được sử dụng làm đối số.

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

Sau cuộc gọi này args[1] sẽ có mới byte[]