2009-09-01 129 views

Respuesta

88

Tendrá que crear una instancia de la clase e invocar el método en ella.

public class Foo 
{ 
    public void Data1() 
    { 
    } 

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

new Foo(). Data1(); – abatishchev

+2

¿Qué sucede si este método está dentro de una página asp? Actualmente estoy luchando con eso. Uno no crea manualmente una instancia de una página asp. Entonces, ¿cómo voy a llamar a un método con una página asp, desde un método estático? (WebMethod) –

+2

@ReidGarwin parece realmente incorrecto poner el comportamiento en algo en una página e intentar llamarlo desde otro lugar. Tal vez debería ser refactorizado a otra clase y tomar una instancia de página como una dependencia si es necesario. Aunque, honestamente, todo este patrón grita que hay algo mal y lo evitaría incluso cuando sea posible. – tvanfosson

8

No puede llamar a un método no estático sin crear primero una instancia de su clase principal.

lo tanto, desde el método estático, que habría que crear una instancia de un nuevo objeto ...

Vehicle myCar = new Vehicle(); 

... y luego llamar al método no estático.

myCar.Drive(); 
14

Debe crear una instancia de esa clase dentro del método estático y luego llamarla.

Por ejemplo así:

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

Tal vez lo que busca es el patrón 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(); 
} 

usted todavía tiene que crear una instancia de la clase, pero se asegura de que hay solamente una instancia.

+1

+1 me vino a la mente exactamente lo mismo cuando leí su pregunta – AaronLS

+4

Los singleton son esencialmente datos globales: hacen que el código sea difícil de probar (las clases se acoplan al Singleton) y (si es mutable) difícil de depurar. Evítelos (y a menudo también métodos estáticos) cuando sea posible. Considere usar una biblioteca DI/IoC Container en su lugar si lo necesita. – TrueWill

5

Solo necesita proporcionar una referencia de objeto. Por favor ingrese su nombre de clase en el puesto.

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

Suponiendo que tanto data1() y data2() están en la misma clase, a continuación, otra alternativa es hacer data1() estática.

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

Se ha disculpado por la respuesta de un hilo muy antiguo, pero creo que mi respuesta puede ayudar a otra.

Con la ayuda del delegado se puede lograr lo mismo.

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

wow eso es exactamente lo que estaba buscando. ¡gracias! – jonathana

-1

El método estático nunca permite una llamada al método no estático directamente.

Motivo: El método estático pertenece solo a su clase, y a ningún objeto o instancia.

Por lo tanto, cada vez que intente acceder a cualquier método no estático del método estático dentro de la misma clase: usted recibirá:

"se requiere una referencia de objeto para el campo no estático, método o propiedad".

Solución: Sólo declarar una referencia como:

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

non-static method() 
{ 

} 


} 
-1

Puede utilizar el método llamado de la siguiente manera: 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(); 
    } 
} 
+0

Su respuesta solo consiste en código, agregue más detalles – live2

Cuestiones relacionadas