文字列情報だけでインスタンス生成&メソッド実行
最近流行の型付言語のFW*1では、ほぼ間違いなくリフレクションを使っているのでちょっと復習。文字列情報だけでロード済みアセンブリ内のオブジェクトについて「インスタンスの生成」と「インスタンスメソッドの生成」を実行する。コード例は以下。
string fullName = "System.Random"; string methodName = "Next"; Type t = Type.GetTypeFromProgID(fullName); object obj = Activator.CreateInstance(t); Console.WriteLine(obj.GetType().FullName); //"System.Random" MethodInfo method = t.GetMethod(methodName, new Type[] { typeof(int) }); object ret = method.Invoke(obj, new object[] { 10 }); Console.WriteLine(ret); // 7 <- ランダムな最大10の値が帰ってくる Console.ReadLine();
インスタンスの生成
Type#GetTypeFromProgIDメソッドを用いて、「文字列→Typeオブジェクト」の橋渡しを行っている。Typeオブジェクトさえ確保できれば、Activator#CreateInstanceメソッドを用いてオブジェクトのインスタンスは生成可能だ。
メソッドの実行
「インスタンスの生成」で得たTypeオブジェクトからType#GetMethodメソッドを実行してメソッド情報を所得する。この際、オブジェクトにオーバーライドされたメソッドが有る場合は new Type[]配列を渡して区別できる。また、Type#GetMethodはBindingFlagを用いて細かく取得できるメソッドを制御できる。
一言
ASP.NET MVCはリフレクション処理を連発して「URLルーティング→コントローラーの取得→アクションの実行」を行いって居るので、この辺りを把握しているのは必須だったりします。
*1:ASP.NET MVCとかねw