原文放在GCDN上,由於GCDN做了整合調整,現在關注產品交流等原因GCDN Blog關閉了,只好把一些有用點的搬過來了。
2009年8月13日12:29 由 winking
寫這篇博客,原起今天CyljXu問我一個問題:如何透過反射呼叫帶有ref或out的參數的方法?想著可能其他人也會遇到這個問題,權且記錄下來,以備後行者搜尋到。
這個在MSDN上有解釋,參考MethodBase.Invoke方法。
public Object Invoke( Object obj, Object[] parameters)
Visual C++
public
: virtual Object^ Invoke( Object^ obj, arrayJ#
public
final Object Invoke( Object obj, Object[] parameters )
JScript
public
final
function
Invoke( obj : Object, parameters : Object[] ) : Object
參數
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: main14 // -------------------------------------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: test21 }22 }23 24 static void TestMethod(ref string arg)25 {26 arg = "test"; // #2 variable, wanna bypass to main process.27 }28 }
To be the apostrophe which changed “Impossible” into “I'm possible”
-------------------------------------------------- --
WinkingZhang's Blog ( http://winkingzhang.cnblogs.com )
GCDN( http://gcdn.grapecity.com/cs )
-