|
.NET TIPS 文字列で指定したメソッドを呼び出すには?デジタルアドバンテージ 遠藤 孝信2005/12/16 |
![]() |
|
|
|
「TIPS:文字列で指定したクラスのインスタンスを作成するには?」では、文字列によるクラスのインスタンス化について解説した。本稿では、メソッドの名前を文字列で指定して、そのメソッドを動的に呼び出す方法について解説する。
MethodInfoクラスのInvokeメソッドによるメソッドの実行
前掲のTIPSと同様に、文字列によりメソッドを呼び出す場合にも、まずは呼び出そうとしているメソッドを含んでいるクラスのTypeオブジェクトを取得する。もしそのクラスのインスタンスがすでに作成済みなら、GetTypeメソッドにより、そのTypeオブジェクトを取得できる(以降のコード例はC#の場合。VB.NETの場合は後掲のサンプル・プログラムを参照してほしい)。
SomeClass sc = new SomeClass();
Type t = sc.GetType();
次に、呼び出そうとするメソッドの名前をパラメータに指定して、取得したTypeオブジェクトのGetMethodメソッドを呼び出す。このメソッドは、MethodInfoクラス(System.Reflection名前空間)のオブジェクトを返す。MethodInfoクラスは特定のメソッドについての情報を表すクラスである。
MethodInfo mi = t.GetMethod("呼び出したいメソッド名");
最後に、MethodInfoオブジェクトのInvokeメソッドを呼び出せば、メソッドを実行することができる。Invokeメソッドは戻り値をobject型として返すので、メソッドに戻り値がある場合には、通常キャストが必要となる。
object o = mi.Invoke(sc, new object[] { パラメータ…… } );
Invokeメソッドの第1パラメータには、呼び出したいメソッドを含むインスタンスを指定する。そのメソッドが静的メソッドならばnull(VB.NETの場合はNothing)を指定する。また、第2パラメータには呼び出したいメソッドに渡すパラメータをobject型の配列で指定する。メソッドがパラメータを取らなければnull(Nothing)を指定する。
文字列で指定したメソッドを呼び出すサンプル・プログラム
以下に、Invokeメソッドを使用したサンプル・プログラムを示す。ここでは、文字列(Stringクラスのインスタンス)に対して、Remove、Substring、IndexOfの3つのメソッドを、メソッド名により実行している。
|
|
| 文字列で指定したメソッドを呼び出すC#のサンプル・プログラム(methodinvoke.cs) | |
|
|
| 文字列で指定したメソッドを呼び出すVB.NETのサンプル・プログラム(methodinvoke.vb) | |
StringクラスのRemoveメソッドは必ず2つの整数型のパラメータを取るが、SubstringメソッドとIndexOfメソッドについては、オーバーロードされたメソッドが存在する。例えばSubstringメソッドには、パラメータとして1つの整数型を取るものと、2つの整数型を取るものがある。
このように、文字列により呼び出そうとしているメソッドがオーバーロードされている場合には、GetMethodメソッドによりMethodInfoオブジェクトを取得する際に、目的とするメソッドのパラメータを第2パラメータで指定して、どのメソッドかを厳密に指定する必要がある。ここには、各パラメータの型のTypeオブジェクトの配列を指定する。
次のコードは、1つの整数型のパラメータを取るSubstringメソッドに関するMethodInfoオブジェクトを取得している。
MethodInfo mi = t.GetMethod(
"Substring", new Type[] { typeof(int) });
2つの整数型のパラメータを取るSubstringメソッドのMethodInfoオブジェクトは次のようにして取得する。
MethodInfo mi = t.GetMethod(
"Substring", new Type[] { typeof(int), typeof(int) });
なお、メソッドではなくプロパティを文字列で指定して呼び出す場合には、TypeクラスのGetPropertyメソッドや、プロパティに関する情報を表すPropertyInfoクラス(System.Reflection名前空間)を利用すればよい。![]()
| カテゴリ:クラス・ライブラリ 処理対象:リフレクション 使用ライブラリ:Typeクラス(System名前空間) 使用ライブラリ:MethodInfoクラス(System.Reflection名前空間) 関連TIPS:文字列で指定したクラスのインスタンスを作成するには? 関連TIPS:メソッドやプロパティの有無を確認して呼び出すには? |
|
||||||||||||||||||||||||||||
| 「.NET TIPS」 |
TechTargetジャパン
- 新人プログラマーのためのInsider.NETの歩き方 2012 (2012/5/22)
晴れて.NETプログラマーとなる新人が効率的に開発技術を習得するには? 大量にある記事群の中から新人が読むべきお勧めを厳選して紹介 - jQuery MobileでJavaScriptプログラミング (2012/5/17)
jQuery Mobileは手軽なだけでなく、JavaScriptのAPIも充実しており、独自機能の実装もできる。今回は「グローバル設定」と「イベント」を解説 - Windows上で開発するための開発環境構築入門 (2012/5/16)
Windowsを使ってチームで開発している? なのにサーバOSを設定・運用した経験がない? そうなら、今すぐ学ぼう - 「コントラクト」でアプリのサンドボックスを乗り越える! (2012/5/11)
Metroスタイル・アプリはサンドボックスの中で動作する。それを乗り越えてほかのアプリと連携する仕組み「コントラクト」を解説
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -


