.NET TIPS

クラス名指定のインスタンス作成時にコンストラクタへ引数を渡すには?[C#、VB]

デジタルアドバンテージ 岸本 真二郎
2009/03/19

 クラス名を表す文字列からインスタンスを生成する方法については、「TIPS:文字列で指定したクラスのインスタンスを作成するには?」で紹介しているが、ここではインスタンスを生成する際に、コンストラクタに引数を渡す方法を紹介する。

 また、上記TIPSではActivatorクラス(System名前空間)のCreateInstanceメソッドを使っているが、ここでは別の例として、実行中のアセンブリからAssemblyクラス(System.Reflection名前空間)のオブジェクトを取得し、そのCreateInstanceメソッドを使ってみる。

AssemblyクラスのCreateInstanceメソッド

 AssemblyクラスのCreateInstanceメソッドは、引数の異なる3種類のメソッドが用意されているが、コンストラクタの引数が指定できるのは、7個のパラメータを持つCreateInstanceメソッドだ。その記述例を以下に示す。

 指定すべき引数の数が多いが、ローカル環境で実行する場合(リモート・オブジェクトを扱わない場合)の引数の指定は複雑ではない。インスタンスの生成に必要な最低限の引数は、クラス名の文字列と、コンストラクタに引数として渡すobject型のオブジェクトの配列である。

using System;
using System.Reflection;

namespace CreateInstanceTest
{
  class TestClass
  {
    public TestClass(string str1, string str2)
    {
      Console.WriteLine(str1 + " " + str2);
    }

    public void MyMethod(string str)
    {
      Console.WriteLine(str);
    }
  }

  class Program
  {
    static void Main(string[] args)
    {
      // 実行中のアセンブリを取得
      Assembly assembly = Assembly.GetExecutingAssembly();

      // インスタンスを生成
      TestClass inst = (TestClass)assembly.CreateInstance(
        "CreateInstanceTest.TestClass", // 名前空間を含めたクラス名
        false, // 大文字小文字を無視するかどうか
        BindingFlags.CreateInstance, // インスタンスを生成
        null, // 通常はnullでOK,
        new object[] { "Hello", "World" }, // コンストラクタの引数
        null, // カルチャ設定(通常はnullでOK)
        null // ローカル実行の場合はnullでOK
      );
      // 出力:Hello World

      // メソッドを実行
      inst.MyMethod("bye");
      // 出力:bye
    }
  }
}
Imports System
Imports System.Reflection

Namespace CreateInstanceTest

  Class TestClass

    Public Sub New(ByVal str1 As String, ByVal str2 As String)
    Console.WriteLine((str1 & " ") + str2)
    End Sub

    Public Sub MyMethod(ByVal str As String)
    Console.WriteLine(str)
    End Sub

  End Class

  Class Program
    Shared Sub Main()

    ' 実行中のアセンブリを取得
    Dim assembly As Assembly = Assembly.GetExecutingAssembly()

    ' インスタンスを生成
    Dim inst As TestClass = CType( _
      assembly.CreateInstance( _
        "CreateInstanceTest.TestClass", _
        False, _
        System.Reflection.BindingFlags.CreateInstance, _
        Nothing, _
        New Object() {"Hello", "World"}, _
        Nothing, _
        Nothing), _
    TestClass)
    ' 出力:Hello World

    ' メソッドを実行
    inst.MyMethod("bye")
    ' 出力:bye

    End Sub
  End Class
End Namespace
Assemblyオブジェクトからのインスタンス生成(上:C#、下:VB)

 このリストに示しているとおり、インスタンス化するクラス名は、名前空間を含めたフルネームで指定する必要がある。Visual StudioでVBを使用していて、現在のアプリケーションの名前空間が分からない場合には、プロジェクトのプロパティを開いて、[アプリケーション]タブにある「ルート名前空間」を確認すればよい。End of Article

カテゴリ:クラス・ライブラリ 処理対象:リフレクション
使用ライブラリ:Assemblyクラス(System.Reflection名前空間)
関連TIPS:文字列で指定したクラスのインスタンスを作成するには?

この記事と関連性の高い別の.NET TIPS
コントロールのクラス名からコントロール・オブジェクトを作成するには?
文字列で指定したクラスのインスタンスを作成するには?
メソッドを呼び出すときに名前付き引数を使うには?[C#/VB]
可変長引数を持つメソッドを作成するには?[C#/VB]
オプション引数が使えるメソッドを作るには?[C#/VB]
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間