MethodInfoとは
ここからは、MethodInfoについて見ていきます。MethodInfoは、動的にメソッドを呼び出すためのものです。たとえば、文字列でメソッド名を指定して呼び出す、といったイメージです。Reflectionは基本的にコンパイル時にシナリオが決まらない場合に使うものなので、文字列として渡ってきた名前のメソッドを実行する、という使い方になります。
MethodInfo
シナリオとしては、クラスのインスタンスを生成したとき、インターフェースやベースクラスに変換できないような場合が考えられます。変換できる場合は、以前やったようにFormなどに変換して、ShowDialogのようなコードを直接書けますが、そうでない場合には、文字列からメソッドを解決して呼び出す、という今回のやり方が必要になります。
Sendメソッドを用意する
実際にやってみましょう。まず、MailServiceにメソッドを作ります。public void Sendというメソッドで、中身はDebug.WriteLineで”send”と出すだけの単純なものです。今回は、この作成したSendを動的に呼び出してみます。
MailServiceに public void Send() メソッドを追加する
GetMethodとInvokeで動的に呼び出す
まずAssemblyとTypeを取得します。AssemblyはAnderson.Domain、TypeはMailServiceです。次に、ActivatorのCreateInstanceでインスタンスを生成します。そして、TypeのGetMethodを使います。ここで指定する”Send”という文字列の部分は、外部から動的に渡されるようなシナリオを想定した箇所です。これをMethodInfoで受け取ります。戻り値はnullになる可能性があるので、実際に使う際はnullチェックを入れてください。今回はそのまま進めます。
呼び出しは、MethodInfoのInvokeを使います。今回は引数なしのメソッドなので、instanceとnullを渡して呼び出します。整理すると、mがMethodInfoで、そこにSendというメソッドの情報が設定されており、Invokeするにはそのメソッドが属するクラスのインスタンスが必要なので、そのインスタンスを渡して「このインスタンスのSendメソッドを呼んでください」と指示している、ということです。この1行を成立させるために、それより前の行で必要な準備をしている、という構成になっています。
Assembly.Load → GetType → Activator.CreateInstance → GetMethod(“Send”) → Invoke という一連の流れ
これを実行してみると、出力に”send!!!!”と表示されます。これで、動的にメソッドがきちんと呼び出せていることが確認できます。
デバッグ出力に send!!!! と表示され、動的な呼び出しが成功していることが分かる
まとめ
TypeのGetMethodでメソッド名からMethodInfoを取得し、そのInvokeにインスタンスと引数を渡すことで、動的にメソッドを呼び出すことができます。インターフェースや基底クラスに変換できないシナリオでは、こうした文字列ベースの呼び出し方を活用してみてください。
はじめに
A01_はじめに
A02_コースの概要
Type
B01_Typeクラスとは
B02_型からTypeを取得する
B03_自前の型からTypeを取得する
B04_インスタンスからTypeを取得する
B05_Typeのインスタンスは1つだけ
Assembly
C01_Assemblyとは
C02_Assemblyの生成_実行中のアセンブリを取得
C03_Assemblyの生成_アセンブリ名で取得
C04_Assemblyの生成_パスを指定して取得
C05_Assemblyの生成_呼び出し元を取得
C06_Assemblyの生成_型から取得
C07_すべての型を取得する
C08_publicな型だけを取得する
C09_名前を指定して型を取得する
C10_メタ情報の取得
インスタンスの生成
D01_インスタンスの生成
D02_インスタンス生成後の具体例
D03_空のコンストラクタがないとエラーになる
D04_Activatorを使ったインスタンスの生成
D05_引数ありのコンストラクタで生成する方法
ConstructorInfo
E01_コンストラクタの情報を取得
E02_パラメータの情報を取得
E03_コンストラクタの情報からインスタンスを生成する
E04_コンストラクタを検索して生成する
E05_public以外のコンストラクタを取得
E06_staticなコンストラクタがある場合の注意点
E07_コンストラクタのアクセスレベルを取得する
MethodInfo
F01_MethodInfo
F02_引数ありのメソッド呼び出し
F03_メソッドがオーバーロードされているときの指定方法
F04_GetMethods
F05_属性で取得する
F06_staticメソッドを呼び出す
F07_戻り値を取得する
PropertyInfo
G01_PropertyInfo
G02_GetProperties
G03_属性を使ったチェック
G04_汎用的なチェックメソッド
G05_CanWrite
FieldInfo
H01_FieldInfo
H02_public以外のFieldInfo
EventInfo
J01_EventInfoとは
J02_AddEventHandler
J03_EventInfoの注意点
J04_RemoveEventHandler
dynamicを利用したリフレクション
K01_dynamicを利用したリフレクション
K02_dynamicを利用したメソッドの呼び方
K03_オーバーライドされたメソッドの呼び出し
K04_メソッドの存在チェック
K05_dynamicを利用したプロパティへのアクセス
K06_dynamicを利用したフィールドへのアクセス
K07_dynamicを利用したイベントへのアクセス