2009-09-01 83 views

回答

88

你需要创建一个类的实例并调用它的方法。

public class Foo 
{ 
    public void Data1() 
    { 
    } 

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

new Foo().Data1(); – abatishchev

+2

如果此方法在asp页面内,该怎么办?我目前正在为此苦苦挣扎。一个不会手动创建一个asp页面的实例。那么,我将如何从静态方法中调用一个带有asp页面的方法? (WebMethod) –

+2

@ReidGarwin将行为放入页面中的某些内容并尝试从别处调用它似乎确实是错误的。也许它应该被重构回另一个类,并且如果需要的话,将Page实例作为一个依赖项。尽管如此,诚然,这种模式尖叫有错,即使可能,我也会避免使用它。 – tvanfosson

8

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

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

Vehicle myCar = new Vehicle(); 

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

myCar.Drive(); 
14

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

例如像这样:

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

也许你在找什么是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

单身主要是全局数据 - 他们让你的代码难以测试(类与单例相结合)和难以调试(如果可变)。尽可能避免它们(通常也是静态方法)。如果需要,可以考虑使用DI/IoC容器库。 – TrueWill

5

您只需要提供对象引用。请提供您的职位名称。

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

假设既data1()data2()处于相同的类,则另一种选择是使data1()静态的。

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

道歉回复很老的帖子,但我相信我的回答可能会帮助其他人。

在代表的帮助下可以实现同样的事情。

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

哇,这正是我正在寻找的。谢谢! – jonathana

-1

静态方法从不允许直接进行非静态方法调用。

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

所以,当您尝试从静态方法访问同一个类中的任何非静态方法:您将获得:

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

解决方法:只需要声明像个参考:

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

non-static method() 
{ 

} 


} 
-1

您可以通过类似这样的电话使用方法:美孚。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(); 
    } 
} 
+0

你的答案只包含代码,添加更多细节 – live2