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


69

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

private void data1()
{
}
private static void data2()
{
   data1(); //generates error
}

尽管存在以下所有答案:您不能真正做到这一点。
TaW

Answers:


125

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

public class Foo
{
    public void Data1()
    {
    }

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

3
如果此方法在ASP页面中怎么办?我目前正在为此而苦苦挣扎。一个人不会手动创建一个ASP页的实例。那么,如何从静态方法调用带有ASP页面的方法呢?(WebMethod)
教务长马丁

4
@ReidGarwin将行为放在页面中的某个东西上并尝试从其他地方调用它似乎是错误的。也许应该将其重构回另一个类,并在需要时将Page实例作为依赖项。虽然,老实说,整个模式都在尖叫,但有可能我会避免。
tvanfosson

这是一个欺骗性的解决方案:一旦Data1依赖实例数据,它就不会真正起作用。如果不是,为什么不使Data1static?
TaW

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

您仍然必须创建该类的一个实例,但要确保只有一个实例。


1
当我读到他的问题时,我想到了+1完全一样的事情
AaronLS

4
Singleton本质上是全局数据-它们使您的代码难以测试(类与Singleton耦合)并且(如果易变)难以调试。尽可能避免使用它们(通常也使用静态方法)。如果需要,可以考虑使用DI / IoC容器库。
TrueWill

21

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

例如这样:

public class MyClass
{
   private void data1()
   {
   }
   private static void data2()
   {
     MyClass c = new MyClass();
     c.data1();
   }
}

12

您必须先创建其父类的实例才能调用非静态方法。

因此,从静态方法开始,您将不得不实例化一个新对象。

Vehicle myCar = new Vehicle();

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

myCar.Drive();

11

您只需要提供对象引用即可。请在职位上提供您的班级名称。

private static void data2()
{
    <classname> c1 = new <classname>();
    c1. data1();
}

6

抱歉为很老的帖子发布答案,但我相信我的答案可能会对其他人有所帮助。

在代表的帮助下,可以实现相同的目标。

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

0

静态方法永远不允许直接调用非静态方法。

原因:静态方法仅属于其类,并且不包含对象或任何实例。

因此,每当您尝试从同一类中的静态方法访问任何非静态方法时,您都会收到:

“非静态字段,方法或属性需要对象引用”。

解决方案:只需声明一个引用,例如:

public class <classname>
{
static method()
{
   new <classname>.non-static();
}

non-static method()
{

}


}

-1

您可以这样使用调用方法:Foo.Data2()

public class Foo
{
    private static Foo _Instance;

    private Foo()
    {
    }

    public static Foo GetInstance()
    {
        if (_Instance == null)
            _Instance = new Foo();
        return _Instance;
    }

    protected void Data1()
    {
    }

    public static void Data2()
    {
        GetInstance().Data1();
    }
}

-2

假设data1()data2()都在同一个类中,那么另一种选择是将其设为data1()静态。

private static void data1()
{
}
private static void data2()
{
   data1();
}

这不是该问题的答案或任何解决方案。
Eru
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.