从静态方法调用非静态方法c#

可能重复:
从静态方法c#调用非静态方法

我们可以从静态方法创建实例中调用非静态方法。 码:

public class Foo { public void Data1() { } public static void Data2() { Foo foo = new Foo(); foo.Data1(); } } 

但是,我听说可以在委托的帮助下从静态方法调用非静态方法。 这是真的吗? 如果是,那怎么样? 请指导我提供示例代码。 谢谢。

这是通过委托调用非静态方法的一种方法。 请注意,这是一个两步过程,因为要调用非静态方法,您绝对需要该类的实例。 我还要注意,几乎可以肯定有更好的方法来做你想做的事情,因为尽管不想使用对象实例需要从静态方法调用非静态方法,这听起来像非静态方法应该是静态的。

 public class MyClass { private static Action NonStaticDelegate; public void NonStaticMethod() { Console.WriteLine("Non-Static!"); } public static void CaptureDelegate() { MyClass temp = new MyClass(); MyClass.NonStaticDelegate = new Action(temp.NonStaticMethod); } public static void RunNonStaticMethod() { if (MyClass.NonStaticDelegate != null) { // This will run the non-static method. // Note that you still needed to create an instance beforehand MyClass.NonStaticDelegate(); } } } 

要调用非静态方法,您需要一个对象的实例 – 没有办法解决这个问题。

是的,您可以使用委托从任何地方调用非静态方法,但是您需要类的实例来创建委托,以便在调用方法时该实例可用。

您始终需要一个实例来调用实例方法。 可以有一个指向实例上的方法的委托 – 但是你仍然有一个正在调用中使用的实例,只是间接地。

你可以做其他聪明的事情,但实际情况是你必须在某处创建或访问非静态对象的实例。 您可以将delgate传递给方法,该方法引用方法的实例(而不是非静态对象的实例上的方法),但必须在代码之外创建。

在提供的代码中你不要在静态方法中调用非stati方法,但是你调用另一个类的实例公共方法,这是不同的故事。

所以在你的情况下,我建议写一些类似的东西:

static void Data2(Foo foo)。

问候。

这样就可以从静态方法中将其称为非静态方法。 要从静态方法调用非静态方法,您必须创建非静态方法所在的类的新引用。所以您的Data1方法在Foo类中,您必须创建一个新的引用(Foo) foo = new Foo())被允许退出静态方法。