酢ろぐ!

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

Windows Phoneで文字列のクラス名から動的にインスタンスを生成させる

例えば、下記のリストのように「HogeCsharp名前空間」に「Nantoka」という任意のクラスがあるとします。ここでは「Nantoka」というstring型で定義された文字列からNantokaクラスのインスタンスを生成する方法を紹介します。

    public class Nantoka {
        public Nantoka() {
            _msg = "コンストラクタ引数なし";
        }
        public Nantoka(string message) {
            _msg = message;
        }
        
        private string _msg;
        public string GetMessage() {
            return _msg;
        }
    }

コンストラクタ引数ありでインスタンスを生成する

コンストラクタ引数を指定したい場合は、下記の通りインスタンス作成時の第5引数にパラメータを指定します。この方法で作成したインスタンスはそのままではメソッドの呼び出しができません。

as演算子で元の型にキャストするか、メソッド名を文字列で指定しInvokeMemberメソッドを使用するかになります。下記のサンプルコードでは後者の方法を使用しています。

// Nantokaクラスの型情報を取得
var type = Type.GetType("HogeCsharp.Nantoka");

// コンストラクタ引数を指定しインスタンスを生成
var obj1 = type.InvokeMember(null, 
            System.Reflection.BindingFlags.CreateInstance,
            null, null, new object[] {"コンストラクタ引数あり"});

// GetMessageメソッドの呼び出し
var result1 = type.InvokeMember("GetMessage",
            System.Reflection.BindingFlags.InvokeMethod,
            null, obj1, null);

MessageBox.Show(result1 as string);

コンストラクタ引数なしでインスタンスを生成する

コンストラクタが引数を取らない場合、インスタンス生成時のInvokeMemberメソッドを呼び出す際に第5引数にnullを指定しています。それ以外については先ほどのコードと同じです。

// Nantokaクラスの型情報を取得
var type = Type.GetType("HogeCsharp.Nantoka");

// コンストラクタ引数を指定せずにインスタンスを生成
var obj2 = type.InvokeMember(null, 
            System.Reflection.BindingFlags.CreateInstance,
            null, null, null);

// GetMessageメソッドの呼び出し
var result2 = type.InvokeMember("GetMessage",
            System.Reflection.BindingFlags.InvokeMethod,
            null, obj2, null);

MessageBox.Show(result2 as string);