C#如何通過反射調用帶有ref或者out的參數的方法


寫這篇博客,原起今天CyljXu問我一個問題:如何通過反射調用帶有ref或者out的參數的方法?想着可能其他人也會遇到這個問題,權且記錄下來,以備后行者搜索到。


這個在MSDN上有解釋,參考 MethodBase.Invoke方法 。

 
 
 
         
public Object Invoke( Object obj, Object[] parameters)


參數

obj 類型:System . Object

對其調用方法或構造函數的對象。如果方法是靜態的,則忽略此參數。如果構造函數是靜態的,則此參數必須為 null 引用(在 Visual Basic
中為 Nothing
或定義該構造函數的類的實例。

parameters
類型: System.Object[]

調用的方法或構造函數的參數列表。這是一個對象數組,這些對象與要調用的方法或構造函數的參數具有相同的數量、順序和類型。如果沒有任何參數,則 parameters 應為 null 引用(在 Visual Basic 中為 Nothing


如果此實例所表示的方法或構造函數采用 ref
參數(在 Visual Basic 中為 ByRef
),使用此函數調用該方法或構造函數時, 該參數不需要任何特殊屬性
。如果數組中的對象未用值來顯式初始化,則該對象將包含該對象類型的默認值。對於引用類型的元素,該值為 null 引用(在 Visual Basic
中為 Nothing
。對於值類型的元素,該值為 0、0.0 或
false
,具體取決於特定的元素類型。

那么該如何調用並處理傳值呢?請看如下示例:
 
 
 
         
1 class Program
2 {
3 static void Main( string [] args)
4 {
5
string content = " main " ; // #1 variable
6 MethodInfo testMethod = typeof (Program).GetMethod( " TestMethod " ,
7 BindingFlags.Static | BindingFlags.NonPublic);
8 if (testMethod != null )
9 {
10 // Following way can not take content back.
11 // -------------------------------------
12 testMethod.Invoke( null , new object [] { content /* #1 variable */ });
13 Console.WriteLine(content); // #1 variable, Output is: main
14 // -------------------------------------
15
16
17 object [] invokeArgs = new object [] { content /* #1 variable */ };
18 testMethod.Invoke( null , invokeArgs);
19 content = ( string )invokeArgs[ 0 ]; // #2 variable, bypass from invoke, set to content.
20 Console.WriteLine(content); // #2 variable, Output is: test
21 }
22 }
23
24 static void TestMethod( ref string arg)
25 {
26 arg = " test " ; // #2 variable, wanna bypass to main process.
27 }
28 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM