如何创建可以稍后执行给定函数的扩展方法?我想出了以下代码,但当您键入 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(){
}
最佳答案
您需要一个 Action 实例来执行您的扩展方法:
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
关于c# - 方法的扩展方法不在 IntelliSense 中显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15404572/