ConstructorInfoを使ってコンストラクタを呼び出し、インスタンスを作成・初期化するには、Invokeメソッドを呼び出します。 呼び出しに際してインスタンスを指定する必要がない点、作成されたインスタンスは戻り値として返される点を除けば、MethodInfo.Invokeメソッドと変わりありません。
ConstructorInfoを使ってコンストラクタを呼び出し、インスタンスを作成する
Imports System
Imports System.Reflection
Class C
Private str As String = "Hello, world!"
Public Sub New()
End Sub
Public Sub New(ByVal str As String)
Me.str = str
End Sub
Public Overrides Function ToString() As String
Return str
End Function
End Class
Class Sample
Shared Sub Main()
Dim t As Type = GetType(C)
Dim inst As Object
' 引数を持たないコンストラクタのConstructorInfoを取得する
Dim c1 As ConstructorInfo = t.GetConstructor(Type.EmptyTypes)
' コンストラクタを呼び出してインスタンスを作成する
inst = c1.Invoke(Nothing)
Console.WriteLine(inst)
' String型の引数を1つとるコンストラクタのConstructorInfoを取得する
Dim c2 As ConstructorInfo = t.GetConstructor(New Type() {GetType(String)})
' コンストラクタを呼び出してインスタンスを作成する
inst = c2.Invoke(New Object() {"Hello, instance!"})
Console.WriteLine(inst)
End Sub
End Class
実行結果
Hello, world! Hello, instance!
コンストラクタ呼び出しの結果例外が発生した場合、例外はTargetInvocationExceptionにラップされた上でスローされます。 TargetInvocationExceptionから実際にスローされた例外を取得する方法については§.TargetInvocationException、TargetInvocationExceptionにラップせずにスローさせる方法については§.BindingFlags.DoNotWrapExceptionsを参照してください。