【问题标题】:Call non-static method from static method c# [duplicate]从静态方法c#调用非静态方法[重复]
【发布时间】:2011-07-16 17:38:21
【问题描述】:

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

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

public class Foo
{
    public void Data1()
    {
    }

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

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

【问题讨论】:

标签: c# oop


【解决方案1】:

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

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】:

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

    【讨论】:

    • 没有人提供代码以使通过委托从静态方法调用非静态方法成为可能。请给我一个示例代码。谢谢。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 没有人提供代码以使通过委托从静态方法调用非静态方法成为可能。请给我一个示例代码。谢谢。
      【解决方案6】:

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

      所以在你的情况下,我建议写这样的东西:

      static void Data2(Foo foo).

      问候。

      【讨论】:

        【解决方案7】:

        像你这样做的这种方式可以从静态方法中调用非静态方法。 要从静态方法调用非静态方法,您必须创建非静态方法所在类的新引用。 所以你的 Data1 方法在 Foo 类中,你必须创建一个新的引用 (Foo foo = new Foo()) 才能退出静态方法。

        【讨论】:

          猜你喜欢
          • 2023-03-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多