2009-09-01 15 views

Odpowiedz

88

Musisz utworzyć instancję klasy i wywołać metodę na niej.

+22

new Foo(). Data1(); – abatishchev

+2

Co się stanie, jeśli ta metoda znajduje się na stronie asp? Obecnie walczę z tym. Jeden nie tworzy ręcznie instancji strony asp. Więc w jaki sposób chciałbym wywołać metodę ze stroną asp, z metody statycznej? (WebMethod) –

+2

@ReidGarwin wydaje się naprawdę błędne umieszczanie zachowania w czymś na stronie i próba wywołania go z innego miejsca. Być może powinien być refaktoryzowany z powrotem na inną klasę i w razie potrzeby pobrać instancję strony jako zależność. Chociaż, szczerze mówiąc, cały ten wzór krzyczy, że coś jest nie tak i uniknęłbym go, nawet jeśli było to możliwe. – tvanfosson

8

Nie można wywołać metody niestatycznej bez uprzedniego utworzenia instancji jej klasy macierzystej.

Więc z metody statyczne, trzeba by instancję nowy obiekt ...

Vehicle myCar = new Vehicle(); 

... a następnie wywołać metodę non-statyczne.

14

Musisz utworzyć instancję tej klasy w metodzie statycznej, a następnie wywołać ją.

Na przykład jak ten:

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

Być może to, czego szukasz jest wzorzec 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(); 
} 

Trzeba jeszcze utworzyć instancję klasy, ale mieć pewność, że jest tylko jedna instancja.

+1

+1 dokładnie to samo przyszło na myśl, kiedy przeczytałem jego pytanie. – AaronLS

+4

Singletony są w zasadzie danymi globalnymi - sprawiają, że twój kod trudny do przetestowania (klasy łączą się z Singletonem) i (jeśli zmienny) jest trudny do debugowania. Unikaj ich (i często statycznych metod), jeśli to możliwe. Rozważ użycie biblioteki kontenerów DI/IoC, jeśli potrzebujesz. – TrueWill

5

Wystarczy podać referencję do obiektu. Podaj swoją klasę w miejscu.

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

Zakładając, że zarówno data1() i data2() są w tej samej klasie, a potem inną alternatywą jest, aby data1() statyczne.

2

Przepraszam za opublikowanie odpowiedzi na bardzo stary wątek, ale wierzę, że moja odpowiedź może pomóc innym.

Przy pomocy delegata można osiągnąć to samo.

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, to jest dokładnie to, czego szukałem. Dziękuję Ci! – jonathana

-1

Metoda statyczna nigdy nie zezwala na wywołanie metody niestatycznej bezpośrednio.

Powód: Metoda statyczna należy do jej klasy i do obiektu lub instancji.

Tak więc, gdy próby uzyskania dostępu do dowolnej metody non-statyczne z metody statycznej wewnątrz tej samej klasy: otrzymasz:

„Odwołanie do obiektu jest wymagane dla pola non-statycznej metody lub mienia”.

Rozwiązanie: Wystarczy zadeklarować odniesienie takiego:

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

non-static method() 
{ 

} 


} 
-1

Można użyć metody wywołania przez tak: 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

Twoja odpowiedź składa się tylko z kodu, dodaj więcej szczegółów – live2

Powiązane problemy