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

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

概要

従来のプログラム言語では、呼び出す関数はコード中に記述し、パラメーターなどの場合分けで呼び出す関数を変えることはできましたが、文字列で指定した関数を呼び出すといったことはできませんでした。リフレクションの機能を利用すると、呼び出す関数名やメソッド名を文字列で指定でき、コンパイル後に呼び出すメソッドや関数を動的に変更できるようになります。
この記事では、リフレクションを用いて、静的クラスのメソッドを呼び出すプログラムを紹介します。

プログラム

UI

下図のUIを作成します。(ボタンが2つ配置されていますが、使用するボタンは1つのみです。)

コード

下記のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

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

    private void button1_Click(object sender, EventArgs e)
    {
      Type t = Type.GetType("System.Math");
      double value = 3.14/2;
      object result = t.InvokeMember("Sin", System.Reflection.BindingFlags.InvokeMethod,
        null, null, new object[] { value });
      textBox1.Text += Convert.ToString(result);
    }
  }
}

解説

Type t = Type.GetType("System.Math");
にて、System.Mathクラスの型(Type)を取得します。

double value = 3.14/2;
object result = t.InvokeMember("Sin", System.Reflection.BindingFlags.InvokeMethod,
  null, null, new object[] { value });
InvokeMemberメソッドを呼び出し、MathクラスのSin()メソッドを呼び出します。第一引数にメソッド名の"Sin"を第二引数にメソッド呼び出しを示す"System.Reflection.BindingFlags.InvokeMethod"を与えます。インスタンスのメソッドではないため第4引数はnullとします。第5引数にSinメソッドの引数を指定します。Sinメソッドの引数はdouble型1つを与えます。メソッドの呼び出し結果はInvokeMemberの戻り値で戻ります。

textBox1.Text += Convert.ToString(result);
戻り値をテキストボックスに表示します。

実行結果

アプリケーションを実行します。ボタンを押すと下図の結果が表示されます。Sin(3.14/2)を与えたため、1に近い数値が結果として表示されています。


著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2012-05-02
iPentec all rights reserverd.