Activator.CreateInstanceメソッドを使用すると、型情報を使って動的にインスタンスを作成することができます。
このメソッドではインスタンスを生成する際、コンストラクタに渡す引数を指定することができます。 コンストラクタに渡す引数はobject
型の配列で指定します。 指定された引数に応じて適切なコンストラクタが自動的に呼び出されます。 当然、抽象クラスのインスタンスを作成しようとした場合や、引数と一致するコンストラクタがない場合は例外がスローされます。
Activator.CreateInstanceを使って型情報からインスタンスを作成する
Imports System
Imports System.Reflection
Class C
Private f As Integer
Public Sub New()
Me.f = 0
End Sub
Public Sub New(ByVal f As Integer)
Me.f = f
End Sub
Public Overrides Function ToString() As String
Return String.Format("f = {0}", f)
End Function
End Class
Class Sample
Shared Sub Main()
Dim inst As Object
' デフォルト(引数なし)のコンストラクタを使ってクラスCのインスタンスを作成する
inst = Activator.CreateInstance(GetType(C))
Console.WriteLine(inst)
' Integer型の引数を1つとるコンストラクタを使ってクラスCのインスタンスを作成する
Dim args As Object() = New Object() {42}
inst = Activator.CreateInstance(GetType(C), BindingFlags.CreateInstance, Nothing, args, Nothing)
Console.WriteLine(inst)
End Sub
End Class
実行結果
f = 0 f = 42
CreateInstanceメソッドで作成したインスタンスはobject
で返されます。 そのためインスタンスを使用する際、既知の型の場合はその型にキャストするか、あるいはobject型のまま後述する方法でリフレクションによって操作を行います。
このように、型情報が取得できれば、動的にインスタンスを作成して操作することができます。 また、動的にアセンブリを読み込み、読み込んだアセンブリに含まれるインスタンスを作成するといったことも可能です。
Activator.CreateInstanceメソッドのほか、Type.InvokeMemberメソッドやConstructorInfo.Invokeメソッドを使うことによっても、型情報からインスタンスを作成することができます。