在C#中使用非静态方法的委托

时间:2017-09-19 23:09:21

标签: c# delegates

问同样的问题 Using delegates with non static methods [no picked answer] 以便给它带来封闭。

所以我使用@Adam Marshall的解决方案,它可以工作,但是一旦我开始使用它,即Testit()

using System;

public class TestClass
{
    private delegate void TestDelegate();
    TestDelegate testDelegate;

    public TestClass()
    {
        testDelegate = new TestDelegate(MyMethod);
    }

    public static void Testit()
    {
        testDelegate();
    }

    private virtual void MyMethod()
    {
        Console.WriteLine("Foobar");
    }
}

public class Program
{
    public static void Main()
    {
        Console.WriteLine("Hello World");
        TestClass.Testit();
    }
}

它开始提供以下错误:

  

非静态字段,方法或属性

需要对象引用

你可以test it out here 。 怎么解决? (如果可能的话请修复它,而不是指导我去其他帖子,我已经读过它们但是我无法理解它们)Thx。

2 个答案:

答案 0 :(得分:1)

要么一切都必须是静态的,要么一切都必须是实例。你因为混合和匹配而陷入困境。

一切都是静止的:

using System;

public class TestClass
{
    private delegate void TestDelegate();
    static TestDelegate testDelegate;    //<-- static

    static TestClass()                   //<-- static
    {
        testDelegate = new TestDelegate(MyMethod);
    }

    public static void Testit()
    {
        testDelegate();
    }

    private static void MyMethod()
    {
        Console.WriteLine("Foobar");
    }
}

public class Program
{
    public static void Main()
    {
        Console.WriteLine("Hello World");
        TestClass.Testit();
    }
}

所有实例:

using System;

public class TestClass
{
    private delegate void TestDelegate();
    TestDelegate testDelegate;

    public TestClass()
    {
        testDelegate = new TestDelegate(MyMethod);
    }

    public void Testit()   
    {
        testDelegate();
    }

    private void MyMethod()
    {
        Console.WriteLine("Foobar");
    }
}

public class Program
{
    public static void Main()
    {
        Console.WriteLine("Hello World");
        var t = new TestClass();
        t.Testit();   //<-- non-static
    }
}

输出(两个例子中都相同):

Hello World
Foobar

答案 1 :(得分:0)

您可以使用操作C#内部委托。这样您就没有指定委托。然后在静态方法中,你可以新建你的对象。

using System;

public class TestClass
{

    Action testDelegate;

    public TestClass()
    {
        testDelegate = new Action(MyMethod);
    }

    public static void Testit()
    {
        TestClass ts = new TestClass();
        ts.testDelegate();
    }

    private void MyMethod()
    {
        Console.WriteLine("Foobar");
    }
}

public class Program
{
    public static void Main()
    {
        Console.WriteLine("Hello World");
        TestClass.Testit();
    }
}

输出:

Hello World
Foobar