« GridViewとDetailsViewでデータ管理ページを作成する | メイン | 1000の質問 »

メソッドやプロパティの動的な呼び出し

メソッドやプロパティの名前を実行時に解決したい時には、以下の方法で動的に呼び出します。

簡単なサンプルで見てみます。

呼び出されるクラスは以下の通り:

// 呼び出されるクラス
class TestClass
{
    // プロパティ
    private string myName = string.Empty;
    public string MyName
    {
        get { return myName; }
        set { myName = value; }
    }

    // 引数なしのメソッド
    public string Hello()
    {
        return "Hello !!";
    }

    // 引数ありのメソッド
    public int Add(int n1, int n2)
    {
        return n1 + n2;
    }
}


呼び出し側は以下の通り:

// 呼び出し方の例
class Program
{
    static void Main(string[] args)
    {
        TestClass tc = new TestClass();
        Type ttc = tc.GetType();

        // 引数なしのメソッド
        MethodInfo mi = ttc.GetMethod("Hello");
        if (mi != null)
        {
            string mes = (string) mi.Invoke(tc, null);
            Console.WriteLine(mes);
        }

        // 引数ありのメソッド
        mi = ttc.GetMethod("Add");
        if (mi != null)
        {
            int result = (int)mi.Invoke(tc, new object[] { 2, 3 });
            Console.WriteLine(result);
        }

        // プロパティの読み書き
        PropertyInfo pi = ttc.GetProperty("MyName");
        if (pi != null)
        {
            // Set
            pi.SetValue(tc, "Visual Studio", null);

            // Get
            string name = (string) pi.GetValue(tc, null);
            Console.WriteLine(name);
        }
    }
}


ポイントは、

  • オブジェクトの型をGetTypeで取得する

  • メソッド名、プロパティ名を指定して、Type.GetMethod,Type.GetPropertyを呼び出す。戻り値はSystem.Reflection名前空間の MethodInfo, PropertyInfo で受ける

  • メソッドの場合には、MethodInfo.Invoke でメソッドを呼び出す。その際、呼び出したいメソッドが引数なしならば Invoke の第2引数は null、引数ありならばnew object[] { ... };とする

  • パラメータの場合には、PropertyInfo.SetValue, GetValue を呼び出す。なお、GetValueの戻り値はObject型なので適切にキャストする。


頻繁に使うテクニックではありませんが、こんなことができるということを覚えておくといいでしょう。

About

2006年05月21日 17:29に投稿されたエントリーのページです。

ひとつ前の投稿は「GridViewとDetailsViewでデータ管理ページを作成する」です。

次の投稿は「1000の質問」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Powered by
Movable Type 3.34