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メソッドを使うことによっても、型情報からインスタンスを作成することができます。

MENTAにてテキストチャットによるサポートを行っています。 問題の解決法をお探しの方や.NET/C#を学習中の方はどうぞご利用ください。