例えば、Sample名前空間にItemというクラスがあります。ここでは"Item"というstring型の文字列からItemクラスのインスタンスを生成し、GetIDメソッドを実行してみましょう。
// Sample名前空間のItemクラス namespace Sample { public class Item { public Item() { _id = int.MinValue; // ID無し } public Item(int id) { _id = id; } private int _id; public int GetID() { return _id; } } }
前準備
System.Reflection名前空間をusingディレクティブで宣言しておきます。この名前空間を宣言することで拡張メソッドであるGetTypeInfoメソッドやGetRuntimeMethodメソッドを使えるようになります。
sing System.Reflection; // ←拡張メソッドのGetRuntimeMethodメソッドに必要 namespace StringToCreateInstanceSample { public sealed partial class MainPage : Page {
コンストラクタ引数を指定せずに、インスタンスを生成する
コンストラクタが引数を取らない場合、ActivatorクラスのCreateInstanceメソッドで型情報を渡すだけで、インスタンスが生成できます。
System.Reflection名前空間を定義したことによって、追加された拡張メソッドGetTypeInfoメソッドとGetRuntimeMethodメソッドを使って、メソッドの属性などの情報を保持するMethodInfo型のオブジェクトを取得します。
あとは、MethodInfoクラスのInvokeメソッドを使えば、GetIDメソッドが実行されます。
private void Button_Click_1(object sender, RoutedEventArgs e) { // Nantokaクラスの型情報を取得 var type = Type.GetType("Sample.Item"); // コンストラクタ引数無しでインスタンスを生成 var instance = Activator.CreateInstance(type); // GetIDメソッドの属性などの情報を取得 var methodInfo = type.GetTypeInfo().GetDeclaredMethod("GetID"); // GetIDメソッドの実行 var obj = methodInfo.Invoke(instance, null); }
コンストラクタ引数を指定してインスタンスを生成する
前述した処理をそのまま流用できます。違いは、Activator.CreateInstanceメソッドの第2引数にobject[]の形でコンストラクタ引数を指定している点です。
private void Button_Click_2(object sender, RoutedEventArgs e) { // Nantokaクラスの型情報を取得 var type = Type.GetType("Sample.Item"); // コンストラクタ引数を指定してインスタンスを生成 var instance = Activator.CreateInstance(type, new object[] { 393 }); // GetIDメソッドの属性などの情報を取得 var methodInfo = type.GetTypeInfo().GetDeclaredMethod("GetID"); // GetIDメソッドの実行 var obj = methodInfo.Invoke(instance, null); }