2012-01-08 4 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 पैरामीटर है दूसरा तर्क के लिए मूल्य प्रदान करने की जरूरत नहीं है - मूल्य विधि द्वारा निर्धारित किया जाएगा। यदि यह 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"; 
    } 
} 
11

एक विधि प्रतिबिंब द्वारा लाया एक ref पैरामीटर यह सरणी कि एक तर्क सूची के रूप में इस्तेमाल किया गया था में वापस कॉपी किया जाएगा है जब। तो प्रतिलिपि वापस संदर्भ प्राप्त करने के लिए आपको केवल तर्क के रूप में उपयोग की जाने वाली सरणी को देखने की आवश्यकता है।

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

के बाद इस कॉल args[1] नई byte[]

होगा