Activator.CreateInstanceメソッドを使用すると、型情報を使って動的にインスタンスを作成することができます。
このメソッドではインスタンスを生成する際、コンストラクタに渡す引数を指定することができます。 コンストラクタに渡す引数はobject
型の配列で指定します。 指定された引数に応じて適切なコンストラクタが自動的に呼び出されます。 当然、抽象クラスのインスタンスを作成しようとした場合や、引数と一致するコンストラクタがない場合は例外がスローされます。
CreateInstanceメソッドで作成したインスタンスはobject
で返されます。 そのためインスタンスを使用する際、既知の型の場合はその型にキャストするか、あるいはobject型のまま後述する方法でリフレクションによって操作を行います。
Activator.CreateInstanceで作成したインスタンスをリフレクションによって操作する
using System;
using System.Reflection;
class C {
public void M()
{
Console.WriteLine("Hello, world!");
}
}
class Sample {
static void Main()
{
var t = typeof(C);
var inst = Activator.CreateInstance(t);
// InvokeMemberメソッドを使って作成したインスタンスのメソッドMを呼び出す
t.InvokeMember("M", BindingFlags.InvokeMethod, null, inst, null);
// インスタンスをキャストして直接メソッドMを呼び出す
var c = (C)inst;
c.M();
}
}
実行結果
Hello, world! Hello, world!
このように、型情報が取得できれば、動的にインスタンスを作成して操作することができます。 また、動的にアセンブリを読み込み、読み込んだアセンブリに含まれるインスタンスを作成するといったことも可能です。
Activator.CreateInstanceメソッドのほか、Type.InvokeMemberメソッドやConstructorInfo.Invokeメソッドを使うことによっても、型情報からインスタンスを作成することができます。