2012-03-26 95 views
6

一個很長的標題,但我希望它是具體的。標題確實是一個問題。即使InvokeMember正在調用的方法有一個out參數,並正在爲該參數分配一個值,我無法獲取該值。下面是我最初使用的代碼:我改成了這一點,這使得現在有工作打算,但我不知道爲什麼我無法使用Type.InvokeMember檢索輸出或ref參數的值?

string parameter = ""; 
int result = Convert.ToInt32(typeof(Ability).InvokeMember(selectedMove, BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static, null, null, new object[] { parameter })); 

原因:

object[] args = new object[1];  //necessary to retrieve ref/out parameter 
int result = Convert.ToInt32(typeof(Ability).InvokeMember(selectedMove, BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static, null, null, args)); 

回答

3

在你的第一個代碼示例中,調用InvokeMember不會修改parameter變量的值,它只是替換參數數組中的第一項(它現在指向不同的string實例)。由於您未保留對此數組的引用,因此無法檢索輸出參數的值。

換句話說:該陣列最初包含parameter變量的副本(即對空字符串的引用的副本)。調用之後,parameter和數組中的值引用2個不同的字符串實例。

5

你的第二個片段缺少一個相當重要的代碼行。它應該是這樣的,假設參數是字符串類型:

object[] args = new object[1];  //necessary to retrieve ref/out parameter 
int result = Convert.ToInt32(typeof(Ability).InvokeMember(selectedMove, 
    BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static, 
    null, null, args)); 
string outValue = (string)args[0]; // <=== here! 

現在也應該是顯而易見的,爲什麼你的第一個片段不能工作,你不必對象[]數組的引用你通過,所以你永遠不會檢索修改後的參數。

6

我只是想幫助一個正在掙扎(我做過)的非託管(COM)和獲取ref參數的人。所以,當對COM方法使用InvokeMember時,你必須知道哪些參數是ref-type。這是通過使用ParameterModifier級來實現,例如:

object[] args = new object[3] { param1, param2, errorStr }; 
ParameterModifier pMod = new ParameterModifier(3); 
pMod[2] = true;    
ParameterModifier[] mods = { pMod }; 

object tempObj = myCOMObject.GetType().InvokeMember("MyCOMMethod", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Public, null, myCOMObject, args, mods, null, null); 

在上述中,第三參數被設定爲基準的代碼(PMOD [2] = TRUE;)

+0

哇...這剛剛救了我,謝謝。 – 2015-08-12 21:31:54

相關問題