问同样的问题 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。
答案 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