酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Windows ストア アプリで文字列のクラス名から動的にインスタンスを生成させ実行する

例えば、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);
}