文字列で指定したクラスのインスタンスを作成するには?.NET TIPS

» 2005年12月09日 05時00分 公開
[遠藤孝信デジタルアドバンテージ]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「.NET TIPS」のインデックス

連載目次

 通常、クラスのインスタンスは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

クラス名からインスタンスを作成するC#のサンプル・プログラム(createinstance.cs)
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

クラス名からインスタンスを作成するVB.NETのサンプル・プログラム(createinstance.vb)
createinstance.vbのダウンロード

 このサンプル・プログラムには、インスタンス化したいクラス(MasterClassクラスやPadawanClassクラス)とインスタンス化のためのコードの両方が含まれているため、GetTypeメソッドをいきなり呼び出して、それらのクラスのTypeオブジェクトが取得可能である。

まだアセンブリがロードされていない場合

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。