2011-07-16 151 views
2

可能重复:
Call non-static method from static method c#呼叫从静态方法C#非静态方法

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

public class Foo 
{ 
    public void Data1() 
    { 
    } 

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

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

+3

来自:http://stackoverflow.com/questions/1360183/call-non-static-method-from-static-method-c重复? –

回答

9

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

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(); 
     } 
    } 
} 
2

您将始终需要一个实例来调用实例方法。可以有一个指向实例方法的委托 - 但是,您仍然有一个正在被调用的实例,只是间接的。

3

要调用一个非静态方法,你需要一个对象的实例 - 这是没有办法的。

+0

为什么我们可以通过类实例在静态方法内调用非静态方法?类实例不会将其转换为静态,是吗? –

3

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

+0

没有人给出让代码可以通过委托从静态方法调用非静态方法的代码。请给我一个示例代码。谢谢。 – Mou

2

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

+0

没有人给出代码来使通过委托从静态方法调用非静态方法成为可能。请给我一个示例代码。谢谢。 – Mou

2

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

所以你的情况我建议写一样的东西:

静态无效数据2(富富)。

问候。

2

这种方式就像你做的那样,可以从静态方法中调用一个非静态方法。 要从静态方法调用非静态方法,必须创建非静态方法所在的类的新引用。因此,您的Data1方法位于Foo类中,您必须创建一个新引用(Foo foo = new Foo())被允许离开静态方法。