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