C#现有方法的扩展方法

时间:2014-01-24 11:12:02

标签: c# .net

如何为现有方法编写扩展方法,如:

static class Extensions
{
    public static void RunAsThread(this Action func)
    {
        Thread t = new Thread(delegate()
        {
            try
            {
                if (func != null)
                    func();
            }
            catch (ThreadInterruptedException tie) { }
            catch (ThreadAbortException tae) { }
            catch (Exception ex)
            {
                Logger.LogDebug(ex);
            }
        });
        t.Start();
    }
}

有什么方法可以按照我想要的方式完美地运行这些方法

class WorkingClass
{
    public void Work()
    {
        //Works fine
        ((Action)DoSomething).RunAsThread();

        //Works fine
        Extensions.RunAsThread(DoSomething);

        //But I really need this to work
        DoSomething.RunAsThread();
    }

    private void DoSomething()
    {
        //Do Something
    }
}

我真的想让DoSomething.RunAsThread()工作。 我试图改变“static void RunAsThread(this delegate ....或this Delegate)”。 无法正常做到。 那有什么工作吗?有没有办法呢?

3 个答案:

答案 0 :(得分:1)

不,你不能这样做,因为DoSomething不是一个类型,它是一种方法。

另外,只是因为你可以将扩展方法附加到类型上,这并不意味着你应该......!

答案 1 :(得分:1)

如果DoSomething 是一个实际的方法,那么稍微调整就可以进行编译:

class WorkingClass
{
    public void Work()
    {
        //Works fine
        ((Action)DoSomething).RunAsThread();

        //Works fine
        Extensions.RunAsThread(DoSomething);

        //But I really need this to work
        DoSomething.RunAsThread();
    }

    private Action DoSomething = () =>
    {
        //Do Something
    };
}

这是否适合你所写的其他所有内容,我不能说。

答案 2 :(得分:0)

DoSomething只是一个“方法组”,只要有可能,它就会隐式转换为Action或兼容的委托类型。

DoSomething本身不是Delegate,因此不可能。但是你可以借助隐式方法组转换来完成以下任务。

Action a = DoSomething;
a.RunAsThread();