Web検索はbingがおすすめ!

リフレクションを用いたクラスのコンストラクタとメソッドの呼び出し - C#

リフレクションを用いて、クラスのコンストラクタとメソッドの呼び出しをするコードを紹介します。

概要

こちらの記事では、リフレクションの機能を利用して静的クラスのメソッドを呼び出しました。 この記事では、リフレクションの機能を利用してコンストラクタを呼び出し、クラスのインスタンスを作成してクラスメソッドを呼び出すコードを紹介します。

プログラム

Windows Formアプリケーションを作成します。

UI

下図のフォームを作成します。複数行のテキストボックスとボタンを配置します。

コード

下記のコードを記述します。
MyClass.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConstructorReflection
{
  public class MyClass
  {
    int value1;
    string value2;

    public MyClass(int a, string b)
    {
      value1 = a;
      value2 = b;
    }

    public string GetData()
    {
      return value2 + value1.ToString();
    }
  }
}
FormMain.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Reflection;

namespace ConstructorReflection
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      Type type = typeof(MyClass);
      ConstructorInfo ctor = type.GetConstructor(new[] { typeof(int), typeof(string) });
      object instance = ctor.Invoke(new object[] { 10, "Penguin" });

      MethodInfo m = type.GetMethod("GetData",new Type[0] { });
      object result = m.Invoke(instance, null);
      textBox1.Text = Convert.ToString(result);
    }
  }
}

解説

MyClass はコンストラクタに整数型(int)と文字列型(string)のパラメーターを受け取りメンバ変数に格納します。 MyClassの GetData()メソッドを呼び出すと、2つのメンバ変数の値を結合した値を文字列型として返します。

今回のプログラムでは、[button1]をクリックすると、MyClassのインスタンスを作成して、GetDataメソッドの呼び出しの処理をリフレクションを利用して実行します。

下記のコードでコンストラクタを取得します。コンストラクタは GetConstructor メソッドで取得できます。GetConstructorに与えるパラメーターと一致するコンストラクタを取得して返します。 今回のコードでは、第一引数にint、第二引数にstring のパラメーターを持つコンストラクタを探してCConstructorInfoオブジェクトを返します。
コンストラクタの呼び出しは、ConstructorInfo オブジェクトの Invoke メソッドで呼び出せます。コンストラクタのパラメータは、object型の配列で与えます。 インスタンス化されたクラスのオブジェクトがInvokeメソッドの戻り値として返ります。
  Type type = typeof(MyClass);
  ConstructorInfo ctor = type.GetConstructor(new[] { typeof(int), typeof(string) });
  object instance = ctor.Invoke(new object[] { 10, "Penguin" });

クラスのメソッドの呼び出しをするコードが以下です。GetMethod() メソッドでクラスのメソッドを取得します。第一引数にメソッド名、第二引数にメソッドのパラメータータイプを与えます。メソッド名とパラメーターの形式が一致するメソッドを探してGetMethodの戻り値としてMethodInfoオブジェクトを返します。
メソッドの呼び出しはコンストラクタの呼び出しと同様に、MethodInfoオブジェクトのInvokeメソッドを呼び出します。第一引数に呼び出すインスタンスオブジェクトを与えます。第二引数には呼び出すメソッドの引数(パラメーター)を与えます。呼び出されたメソッドの戻り値は、Invokeメソッドの戻り値として返ります。
今回のコードでは、引数のない"GetData"メソッドを呼び出し、その戻り値をテキストボックスに表示するコードとなっています。
  MethodInfo m = type.GetMethod("GetData",new Type[0] { });
  object result = m.Invoke(instance, null);
  textBox1.Text = Convert.ToString(result);

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


[button1]をクリックします。リフレクションによりクラスのインスタンスを生成し、メンバ変数に値を代入しています。 リフレクションでGetDataメソッドを呼び出し、インスタンスオブジェクトのメンバ変数に代入した2つの値を結合した文字列を取得し、 テキストボックスに結果が表示できていることが確認できました。


リフレクションを利用して、クラスのインスタンス作成とインスタンス化されたクラスのメソッドの呼び出しができました。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2020-05-01
iPentec all rights reserverd.