C#でメソッド名の一覧を取得とメソッドの実行

C# コンピュータ
C#

オブジェクトのメソッド名の一覧を取得し、特定の条件に当てはまるメソッドを実行することが出来るか試してみました。

まずはメソッド名の一覧を取得してみます。

class MyClass
{
    void InitA()
    {
        Console.WriteLine("InitA()が呼ばれた");
    }
    void InitB()
    {
        Console.WriteLine("InitB()が呼ばれた");
    }
    void TestFunc()
    {
        Console.WriteLine("TestFunc()は呼ばれない");
    }
    void initialize()
    {
        Type type = this.GetType(); // 自分自身のクラスの情報を取得
        // メソッドの一覧を取得
        foreach(var mi in type.GetMethods())
        {
            Console.WriteLine("{0}", mi.Name);
        }
    }
    // コンストラクタ
    public MyClass()
    {
        initialize(); 
    }
}
class Program
{
    public static void Main()
    {
        var obj = new MyClass();
    }
}

実行してみると以下のような結果になりました。

GetType
ToString
Equals
GetHashCode

InitAなどのメソッド名が出力されることを期待したのですが、残念ながら出力されていません。
出力されているメソッド名は外部から呼び出せるメソッドのようなのでメソッドをpublicに宣言しなおして再度実行してみます。

class MyClass
{
    public void InitA()
    {
        Console.WriteLine("InitA()が呼ばれた");
    }
    public void InitB()
    {
        Console.WriteLine("InitB()が呼ばれた");
    }
    public void TestFunc()
    {
        Console.WriteLine("TestFunc()は呼ばれない");
    }
    void initialize()
    {
        Type type = this.GetType(); // 自分自身のクラスの情報を取得
        // メソッドの一覧を取得
        foreach(var mi in type.GetMethods())
        {
            Console.WriteLine("{0}", mi.Name);
        }
    }
    // コンストラクタ
    public MyClass()
    {
        initialize(); 
    }
}
class Program
{
    public static void Main()
    {
        var obj = new MyClass();
    }
}

実行してみます。

InitA
InitB
TestFunc
GetType
ToString
Equals
GetHashCode

今度はInitAなどユーザーが定義したメソッド名が表示されるようになりました。
次にInitから始まるメソッドを呼び出すようにしてみます。

using System.Text.RegularExpressions;
class MyClass
{
    public void InitA()
    {
        Console.WriteLine("InitA()が呼ばれた");
    }
    public void InitB()
    {
        Console.WriteLine("InitB()が呼ばれた");
    }
    public void TestFunc()
    {
        Console.WriteLine("TestFunc()は呼ばれない");
    }
    void Initialize()
    {
        Type type = this.GetType(); // 自分自身のクラスの情報を取得
        // メソッドの一覧を取得
        foreach(var mi in type.GetMethods())
        {
            // Initで始まるメソッド以外を排除
            if (Regex.IsMatch(mi.Name, "^Init.+$") == false) continue;

            // メソッドの呼び出し
            mi.Invoke(this, null);
        }
    }
    // コンストラクタ
    public MyClass()
    {
        Initialize(); 
    }
}
class Program
{
    public static void Main()
    {
        var obj = new MyClass();
    }
}

実行した結果は次のようになりました。

InitA()が呼ばれた
InitB()が呼ばれた

希望のとおりメソッド名がInitから始まるメソッドが呼び出されました。

うまくいくか試すまでわかりませんが、今作成しているアプリケーションで使ってみたいと思います。

追記:
初期化処理に使ってみましたが、処理の順番を気にしなくてよいのであれば使えました。

コメント