如何从C#中的静态方法调用非静态方法?

Yay*_*yan 59 c#

我有以下代码,我想打电话data1()data2().这可能在C#中吗?如果是这样,怎么样?

private void data1()
{
}
private static void data2()
{
   data1(); //generates error
}
Run Code Online (Sandbox Code Playgroud)

tva*_*son 109

您需要创建该类的实例并在其上调用该方法.

public class Foo
{
    public void Data1()
    {
    }

    public static void Data2()
    {
         Foo foo = new Foo();
         foo.Data1();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • new Foo().Data1(); (29认同)
  • 如果此方法在asp页面内怎么办?我目前正在努力解决这个问题.一个不手动创建asp页面的实例.那么我如何从静态方法中调用一个带有asp页面的方法呢?(的WebMethod) (2认同)
  • @ReidGarwin将行为置于页面中的某些内容并尝试从其他地方调用它似乎是错误的.也许它应该重构为另一个类,并在需要时将Page实例作为依赖项.虽然,老实说,整个模式尖叫有一些错误,即使可能,我也会避免它. (2认同)

Kep*_*boy 27

也许您正在寻找的是Singleton模式?

public class Singleton
{
    private Singleton() {}

    public void DoWork()
    { 
        // do something
    }

    // You can call this static method which calls the singleton instance method.
    public static void DoSomeWork()
    { 
        Instance.DoWork();
    }

    public static Singleton Instance
    {
        get { return instance; } 
    }

    private static Singleton instance = new Singleton();
}
Run Code Online (Sandbox Code Playgroud)

您仍然需要创建类的实例,但确保只有一个实例.

  • 单例基本上是全局数据 - 它们使您的代码难以测试(类与单例连接)和(如果可变)难以调试.尽可能避免它们(通常也是静态方法).如果需要,请考虑使用DI/IoC容器库. (4认同)

Jim*_*m W 17

您必须在静态方法中创建该类的实例,然后调用它.

例如这样:

public class MyClass
{
   private void data1()
   {
   }
   private static void data2()
   {
     MyClass c = new MyClass();
     c.data1();
   }
}
Run Code Online (Sandbox Code Playgroud)


Bra*_*don 10

如果不先创建父类的实例,则无法调用非静态方法.

因此,从静态方法,您必须实例化一个新对象...

Vehicle myCar = new Vehicle();
Run Code Online (Sandbox Code Playgroud)

...然后调用非静态方法.

myCar.Drive();
Run Code Online (Sandbox Code Playgroud)


小智 7

您只需要提供对象引用.请在职位上提供您的班级姓名.

private static void data2()
{
    <classname> c1 = new <classname>();
    c1. data1();
}
Run Code Online (Sandbox Code Playgroud)


Mou*_*Mou 7

很抱歉为非常旧的帖子发布答案,但我相信我的回答可能会帮助其他人。

在委托的帮助下,可以实现同样的事情。

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)