いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Reflectionについて-2(リフレクション, System.Reflection, Type, Assembly, Activator)


次は、取得したTypeオブジェクトからインスタンスを作成する方法です。


主に2つのクラスを利用します。

  • Activator
  • Assembly


どちらもTypeオブジェクトからインスタンスを作成する場合は

CreateInstanceメソッド


を使用しますが、ちょっと挙動が違うのでご注意を。
以下サンプルです。

#region Reflection-02

    public class ReflectionSample02 : IExecutable{

        public void Execute(){

            Type type = typeof(List);

            //
            // Activatorを利用してインスタンス化.(Typeのみの指定)
            //
            object obj = Activator.CreateInstance(type);
            Console.WriteLine(obj.GetType());

            //
            // Activatorを利用してインスタンス化.(Assembly名と型名)
            // この場合、戻り値はSystem.Runtime.Remoting.ObjectHandleになります。
            //
            ObjectHandle objHandle = Activator.CreateInstance(Assembly.GetAssembly(type).FullName, type.FullName);
            obj = objHandle.Unwrap();
            Console.WriteLine(objHandle.GetType());
            Console.WriteLine(obj.GetType());

            //
            // Assemblyを利用してインスタンス化.
            // 以下が使えるのは、対象となるクラスが既に読み込み済みのアセンブリの場合です。
            // まだ読み込まれていないアセンブリに含まれるクラスの場合は先にLoadしてから使います。
            //
            obj = Assembly.GetAssembly(type).CreateInstance(type.FullName);
            Console.WriteLine(obj.GetType());
        }
    }
#endregion
}