この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
通常、クラスのインスタンスはnewキーワード(VB.NETの場合はNewキーワード)により作成するが、リフレクションの機能により、文字列で指定されたクラス名からインスタンスを作成することもできる。
本稿では、インスタンス化したいクラスを含んだアセンブリがすでにロードされている場合と、そのアセンブリがまだロードされていない場合の2つのケースについて、クラス名からインスタンスを作成する方法について解説する。
インスタンス化したいクラスを含んだアセンブリがすでにディスクからロードされている場合には、まずTypeクラス(System名前空間)のGetTypeメソッドにより、そのクラスのTypeオブジェクトを得る。GetTypeメソッドでは、パラメータとしてクラス名を文字列で指定できる。
Type t = Type.GetType("インスタンス化したいクラス名");
Typeオブジェクトは、特定のクラス(型)に関する情報を含んだオブジェクトである。Typeオブジェクトが得られれば、Activatorクラス(System名前空間)のCreateInstanceメソッドにより、そのTypeオブジェクトが示すクラスのインスタンスを作成できる。
object o = Activator.CreateInstance(t);
このCreateInstanceメソッドは作成したインスタンスをobject型として返すため、そのインスタンスのメンバにアクセスするには何らかのキャストが必要となる。
以下にこれら2つのメソッドを利用した例を示す。
// createinstance.cs
using System;
public class MasterClass {
public virtual void Say() {
Console.WriteLine("Use the Force");
}
}
public class PadawanClass : MasterClass {
public override void Say() {
Console.WriteLine("Yes, Master");
}
}
public class JediMaster {
static void Main() {
Type masterType = Type.GetType("MasterClass");
MasterClass obiwan
= (MasterClass)Activator.CreateInstance(masterType);
obiwan.Say(); // 出力:Use the Force
Type padawanType = Type.GetType("PadawanClass");
MasterClass anakin
= (MasterClass)Activator.CreateInstance(padawanType);
anakin.Say(); // 出力:Yes, Master
}
}
// コンパイル方法:csc createinstance.cs
' createinstance.vb
Imports System
Public Class MasterClass
Public Overridable Sub Say()
Console.WriteLine("Use the Force")
End Sub
End Class
Public Class PadawanClass
Inherits MasterClass
Public Overrides Sub Say()
Console.WriteLine("Yes, Master")
End Sub
End Class
Public Class JediMaster
Shared Sub Main()
Dim masterType As Type = Type.GetType("MasterClass")
Dim obiwan As MasterClass = _
CType(Activator.CreateInstance(masterType), MasterClass)
obiwan.Say() ' 出力:Use the Force
Dim padawanType As Type = Type.GetType("PadawanClass")
Dim anakin As MasterClass = _
CType(Activator.CreateInstance(padawanType), MasterClass)
anakin.Say() ' 出力:Yes, Master
End Sub
End Class
' コンパイル方法:vbc createinstance.vb
このサンプル・プログラムには、インスタンス化したいクラス(MasterClassクラスやPadawanClassクラス)とインスタンス化のためのコードの両方が含まれているため、GetTypeメソッドをいきなり呼び出して、それらのクラスのTypeオブジェクトが取得可能である。
Copyright© Digital Advantage Corp. All Rights Reserved.