IntelliSense中不显示方法的扩展方法

时间:2013-03-14 08:42:45

标签: c# .net function extension-methods timing

如何创建可以在以后执行给定函数的扩展方法?我已经提出了以下代码,但是当您键入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(){
}

3 个答案:

答案 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>