DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

文字列で指定されたクラスのインスタンスを作成し、メソッドを実行する

文字列で指定されたクラスのインスタンスを作成する方法及び、文字列で指定されたメソッドを実行する方法に関しては、「型のメンバを動的に呼び出す」で詳しく説明しています。ここではさらに具体的な例をいくつか示します。

Stringクラスのインスタンスを作成し、Replaceメソッドを呼び出す例

次の例では、"System.String"という文字列からStringクラスのインスタンスを作成し(パラメータとして、"'*', 10"を指定)、さらにStringクラスのReplaceメソッドを呼び出しています(パラメータとして、"'*', '+'"を指定)。

VB.NET
コードを隠すコードを選択
Imports System

Class MainClass
    'エントリポイント
    Public Shared Sub Main()
        'System.StringのTypeを取得する
        Dim t As Type = Type.GetType("System.String")

        'System.Stringのインスタンスを作成する
        'str = New System.String("*"c, 10)
        'と同等
        Dim str As Object = t.InvokeMember(Nothing, _
            System.Reflection.BindingFlags.CreateInstance, _
            Nothing, Nothing, New Object() {"*"c, 10})
        '次のようにしてインスタンスを作成することもできる
        'Dim str As Object = System.Activator.CreateInstance(t,
        '    New Object() {"*"c, 10})

        'System.StringのReplaceメソッドを呼び出す
        'result = str.Replace('*', '+')
        'と同等
        Dim result As Object = t.InvokeMember("Replace", _
            System.Reflection.BindingFlags.InvokeMethod, _
            Nothing, str, New Object() {"*"c, "+"c})

        '結果を表示する
        Console.WriteLine(result)

        Console.ReadLine()
    End Sub
End Class
C#
コードを隠すコードを選択
using System;

class MainClass
{
    //エントリポイント
    public static void Main() 
    {
        //System.StringのTypeを取得する
        Type t = Type.GetType("System.String");

        //System.Stringのインスタンスを作成する
        //str = new System.String('*', 10);
        //と同等
        object str = t.InvokeMember(null,
            System.Reflection.BindingFlags.CreateInstance,
            null, null,
            new object[] {'*', 10});
        //次のようにしてインスタンスを作成することもできる
        //object str = System.Activator.CreateInstance(t,
        //    new object[] {'*', 10});

        //System.StringのReplaceメソッドを呼び出す
        //result = str.Replace('*', '+');
        //と同等
        object result = t.InvokeMember("Replace",
            System.Reflection.BindingFlags.InvokeMethod,
            null, str,
            new object[] {'*', '+'});

        //結果を表示する
        Console.WriteLine(result);

        Console.ReadLine();
    }
}

文字列で指定されたフォームを表示する

次にWindowsアプリケーションのフォームを表示する例を示します。ここでは、アセンブリ"WindowsApplication1.exe"にForm1クラスがあるものとし、 Form1クラスのインスタンスを作成し、そのShowDialogメソッドを呼び出すことにより、Form1を表示しています。

VB.NET
コードを隠すコードを選択
Imports System

Class MainClass
    'エントリポイント
    Public Shared Sub Main()
        'アセンブリ"WindowsApplication1.exe"を読み込む
        Dim asm As System.Reflection.Assembly = _
            System.Reflection.Assembly.LoadFile("WindowsApplication1.exe")

        'Form1のTypeを取得する
        Dim t As Type = asm.GetType("WindowsApplication1.Form1")

        'Form1のインスタンスを作成する
        Dim frm As Object = t.InvokeMember(Nothing, _
            System.Reflection.BindingFlags.CreateInstance, _
            Nothing, Nothing, Nothing)

        'Form1のShowDialogメソッドを呼び出し、フォームを表示する
        Dim result As Object = t.InvokeMember("ShowDialog", _
            System.Reflection.BindingFlags.InvokeMethod, _
            Nothing, frm, Nothing)

        '結果を表示する
        Console.WriteLine(result)

        Console.ReadLine()
    End Sub
End Class
C#
コードを隠すコードを選択
using System;

class MainClass
{
    //エントリポイント
    public static void Main() 
    {
        //アセンブリ"WindowsApplication1.exe"を読み込む
        System.Reflection.Assembly asm =
            System.Reflection.Assembly.LoadFile("WindowsApplication1.exe");

        //Form1のTypeを取得する
        Type t = asm.GetType("WindowsApplication1.Form1");

        //Form1のインスタンスを作成する
        object frm = t.InvokeMember(null,
            System.Reflection.BindingFlags.CreateInstance,
            null, null,
            null);

        //Form1のShowDialogメソッドを呼び出し、フォームを表示する
        object result = t.InvokeMember("ShowDialog",
            System.Reflection.BindingFlags.InvokeMethod,
            null, frm,
            null);

        //結果を表示する
        Console.WriteLine(result);

        Console.ReadLine();
    }
}

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • .NET Tipsをご利用いただく際は、注意事項をお守りください。