3

特定の関数を後で実行できる拡張メソッドを作成するにはどうすればよいですか? 次のコードを思いつきましたが、入力しても IntelliSense リストに表示されませんMyFunc.DoLater()

静的クラスで拡張メソッドを宣言しました...

using TTimer = System.Timers.Timer; // to prevent confusion with Windows.Forms.Timer

public static void DoLater(this Action handler, int delay) {
    TTimer timer = new TTimer(delay);
    timer.Elapsed += delegate {
       handler();
       timer.Dispose();
    };
    timer.Start();
}

...そして、パラメーターのないクラスMyFuncの単なるメソッドです。Form

public void MyFunc(){
}
4

3 に答える 3

1

メソッドを としてキャストしActionます。

((Action)MyMethod).DoLater(10000);

拡張メソッドを使用するために、コンパイラは type のオブジェクトを想定していますAction。メソッド メンバーとメンバーの違いがよくわかりませんActionが、メソッドから への明示的な変換があると思いActionます。

于 2013-03-15T00:48:10.083 に答える
1

良いアイデア。System.Timers.Timer を使用して試してみましたが、正常に動作します。

static class Program
{
    static System.Timers.Timer _timer;

    static void Main(string[] args)
    {
        DoLater(SayHello, 5000);
        Console.ReadLine();
    }

    public static void DoLater(this Action handler, int delay)
    {
        _timer = new System.Timers.Timer(delay);
        _timer.Elapsed += new ElapsedEventHandler(delegate {
                                   handler();
                                   _timer.Dispose();
                                });
        _timer.Enabled = true;
    }

    public static void SayHello()
    {
        MessageBox.Show("Hello World");
    }
}
于 2013-03-14T09:19:51.857 に答える