|
.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を使用していて、現在のアプリケーションの名前空間が分からない場合には、プロジェクトのプロパティを開いて、[アプリケーション]タブにある「ルート名前空間」を確認すればよい。
|
generated by
|
|
Insider.NET 記事ランキング
本日
月間