normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

文字列情報だけでインスタンス生成&メソッド実行

最近流行の型付言語の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