ConstructorInfoを使ってコンストラクタを呼び出し、インスタンスを作成・初期化するには、Invokeメソッドを呼び出します。 呼び出しに際してインスタンスを指定する必要がない点、作成されたインスタンスは戻り値として返される点を除けば、MethodInfo.Invokeメソッドと変わりありません。
ConstructorInfoを使ってコンストラクタを呼び出し、インスタンスを作成する
using System;
using System.Reflection;
class C {
private string str = "Hello, world!";
public C()
{
}
public C(string str)
{
this.str = str;
}
public override string ToString()
{
return str;
}
}
class Sample {
static void Main()
{
var t = typeof(C);
object inst;
// 引数を持たないコンストラクタのConstructorInfoを取得する
var c1 = t.GetConstructor(Type.EmptyTypes);
// コンストラクタを呼び出してインスタンスを作成する
inst = c1.Invoke(null);
Console.WriteLine(inst);
// string型の引数を1つとるコンストラクタのConstructorInfoを取得する
var c2 = t.GetConstructor(new Type[] {typeof(string)});
// コンストラクタを呼び出してインスタンスを作成する
inst = c2.Invoke(new object[] {"Hello, instance!"});
Console.WriteLine(inst);
}
}
実行結果
Hello, world! Hello, instance!
コンストラクタ呼び出しの結果例外が発生した場合、例外はTargetInvocationExceptionにラップされた上でスローされます。 TargetInvocationExceptionから実際にスローされた例外を取得する方法については§.TargetInvocationException、TargetInvocationExceptionにラップせずにスローさせる方法については§.BindingFlags.DoNotWrapExceptionsを参照してください。