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

时间:2011-07-16 09:14:01

标签: c# oop

  

可能重复:
  Call non-static method from static method c#

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

public class Foo
{
    public void Data1()
    {
    }

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

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

7 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:3)

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

答案 3 :(得分:2)

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

答案 4 :(得分:2)

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

答案 5 :(得分:2)

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

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

static void Data2(Foo foo)。

问候。

答案 6 :(得分:2)

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