元の投稿は GCDN に投稿されました。GCDN は統合調整を行っており、現在は製品交換などの理由で GCDN ブログが閉鎖されているため、いくつかの有用な投稿をここに移動する必要がありました。
2009年8月13日 12:29 by ウィンク
このブログを書いている今日、CyljXu さんから質問がありました。リフレクションを通じて ref または out パラメーターを使用してメソッドを呼び出すにはどうすればよいですか?他の人もこの問題に遭遇するかもしれないと考え、将来の読者が検索できるように記録しておきたいと思います。
これについては MSDN で説明されています。MethodBase.Invoke メソッドを参照してください。
public Object Invoke(Object obj, Object[] パラメータ)
ビジュアルC++
公共
: virtual Object^ Invoke( Object^ obj, arrayJ#
公共
Final Object Invoke(オブジェクト obj、Object[] パラメータ)
JScript
公共
ファイナル
関数
Invoke( obj : オブジェクト, パラメータ : Object[] ) : オブジェクト
パラメータ
obj 型: System.Object
メソッドまたはコンストラクターが呼び出されるオブジェクト。メソッドが静的である場合、このパラメータは無視されます。コンストラクターが静的な場合、このパラメーターは null 参照 (Visual Basic では Nothing) またはコンストラクターが定義されているクラスのインスタンスである必要があります。
パラメータの型: System.Object[]
呼び出されるメソッドまたはコンストラクターのパラメーターのリスト。これは、呼び出されるメソッドまたはコンストラクターのパラメーターと同じ数、順序、および型を持つオブジェクトの配列です。パラメーターがない場合、パラメーターは null 参照 (Visual Basic では Nothing) である必要があります。
このインスタンスによって表されるメソッドまたはコンストラクターが ref パラメーター (Visual Basic では ByRef) を取る場合、この関数を使用してメソッドまたはコンストラクターを呼び出すときにパラメーターには特別な属性は必要ありません。配列内のオブジェクトが値で明示的に初期化されていない場合、オブジェクトにはそのオブジェクト タイプのデフォルト値が含まれます。参照型の要素の場合、値は null Reference (Visual Basic では Nothing) です。値型の要素の場合、値は特定の要素型に応じて 0、0.0、または false になります。
では、渡された値を呼び出して処理するにはどうすればよいでしょうか?次の例を参照してください。
1 クラス プログラム 2 { 3 static void Main(string[] args) 4 { 5 string content = "main"; //#1 変数 6 MethodInfo testMethod = typeof(Program).GetMethod("TestMethod", 7 BindingFlags.Static | BindingFlags.NonPublic); 8 if (testMethod != null) 9 {10 // 次の方法ではコンテンツを取り戻すことができません。11 // --------------------- ----------------12 testMethod.Invoke(null, new object[] { content /* #1 変数 */ });13 Console.WriteLine(content); 1 変数、出力は次のとおりです: main14 // -------------------------------------- ----15 16 17 object [] invokeArgs = new object[] { content /* #1 変数 */ };18 testMethod.Invoke(null, invokeArgs);19 content = (string)invokeArgs[0]; // #2 変数、呼び出しからバイパス、content.20 に設定 Console.WriteLine(content); // #2 変数、出力は次のとおりです: test21 }22 }23 24 static void TestMethod(ref string arg)25 {26 arg = "test "; // #2 変数、メインプロセスをバイパスしたい27 }28 }
「不可能」を「可能です」に変えるアポストロフィになること
-------------------------------------------------- --
WinkingZhang のブログ ( http://winkingzhang.cnblogs.com )
GCDN( http://gcdn.grapecity.com/cs )
-