如何创建可以在以后执行给定函数的扩展方法?我已经提出了以下代码,但是当您键入MyFunc.DoLater()
时,它不会列在IntelliSense列表中。
我已在静态类中声明了扩展方法...
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(){
}
答案 0 :(得分:3)
您需要一个操作实例来执行您的扩展方法:
var a = new Action(() => MyFunc());
a.DoLater();
但我建议采用更好,更通用的方法:
public static class DoLaterExtension
{
public static void DoLater<T>(this T x, int delay, Action<T> action)
{
// TODO: Impelement timer logic
action.Invoke(x);
}
}
private void Example()
{
var instance = new MyForm();
instance.DoLater(1000, x => x.MyFunc());
}
请注意,最好使用System.Windows.Fomrs.Timer
来避免线程问题。
或TPL方式(如果你在.net 4.0我会建议)。
public static void DoLater<T>(this T x, int delay, Action<T> action)
{
var scheduler = TaskScheduler.FromCurrentSynchronizationContext();
Task.Factory.StartNew(() =>
{
System.Threading.Thread.Sleep(delay);
}).ContinueWith(t =>
{
action.Invoke(x);
}, scheduler);
}
如果你使用.net 4.5,你甚至可以使用Task.Delay
http://msdn.microsoft.com/en-us/library/hh194845.aspx
答案 1 :(得分: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");
}
}
答案 2 :(得分:1)
将该方法转换为Action
。
((Action)MyMethod).DoLater(10000);
要使用扩展方法,编译器需要类型为Action
的对象。我不完全确定方法成员与Action
成员之间的区别是什么,但我猜测有从方法到Action
的显式转换。< / p>