Wie rufe ich eine nicht statische Methode von einer statischen Methode in C # auf?

69

Ich habe den folgenden Code, ich möchte anrufen data1()aus data2(). Ist das in C # möglich? Wenn das so ist, wie?

private void data1()
{
}
private static void data2()
{
   data1(); //generates error
}
Yayan
quelle
Ungeachtet aller Antworten unten: Das kann man nicht wirklich tun.
TaW

Antworten:

125

Sie müssen eine Instanz der Klasse erstellen und die Methode darauf aufrufen.

public class Foo
{
    public void Data1()
    {
    }

    public static void Data2()
    {
         Foo foo = new Foo();
         foo.Data1();
    }
}
Tvanfosson
quelle
3
Was ist, wenn sich diese Methode auf einer Asp-Seite befindet? Ich kämpfe derzeit damit. Man erstellt keine Instanz einer Asp-Seite manuell. Wie würde ich eine Methode mit einer Asp-Seite von einer statischen Methode aus aufrufen? (WebMethod)
Dean Martin
4
@ReidGarwin Es scheint wirklich falsch, Verhalten in etwas auf einer Seite einzufügen und zu versuchen, es von einer anderen Stelle aus aufzurufen. Vielleicht sollte es zurück in eine andere Klasse umgestaltet werden und bei Bedarf eine Page-Instanz als Abhängigkeit verwenden. Obwohl dieses ganze Muster ehrlich gesagt schreit, stimmt etwas nicht und ich würde es vermeiden, selbst wenn es möglich ist.
Tvanfosson
Dies ist eine trügerische Lösung: Es wird nicht wirklich funktionieren, sobald Data1 auf die Instanzdaten angewiesen ist. Wenn nicht, warum nicht Data1static machen?
TaW
27

Vielleicht suchen Sie nach dem Singleton-Muster?

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

Sie müssen noch eine Instanz der Klasse erstellen, stellen jedoch sicher, dass nur eine Instanz vorhanden ist.

Kepboy
quelle
1
+1 genau das gleiche kam mir in den Sinn, als ich seine Frage las
AaronLS
4
Singletons sind im Wesentlichen globale Daten - sie erschweren das Testen Ihres Codes (Klassen werden an den Singleton gekoppelt) und (falls veränderbar) das Debuggen. Vermeiden Sie sie (und oft auch statische Methoden), wenn möglich. Verwenden Sie stattdessen bei Bedarf eine DI / IoC-Container-Bibliothek.
TrueWill
21

Sie müssen eine Instanz dieser Klasse innerhalb der statischen Methode erstellen und dann aufrufen.

Zum Beispiel so:

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

Sie können eine nicht statische Methode nicht aufrufen, ohne zuvor eine Instanz ihrer übergeordneten Klasse erstellt zu haben.

Mit der statischen Methode müssten Sie also ein neues Objekt instanziieren ...

Vehicle myCar = new Vehicle();

... und rufen Sie dann die nicht statische Methode auf.

myCar.Drive();
Brandon
quelle
11

Sie müssen nur eine Objektreferenz angeben. Bitte geben Sie Ihren Klassennamen in der Position an.

private static void data2()
{
    <classname> c1 = new <classname>();
    c1. data1();
}
Löwe
quelle
6

Ich habe mich entschuldigt, eine Antwort für einen sehr alten Thread zu posten, aber ich glaube, meine Antwort kann anderen helfen.

Mit Hilfe eines Delegierten kann das Gleiche erreicht werden.

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

Die statische Methode erlaubt niemals einen nicht statischen Methodenaufruf direkt.

Grund: Die statische Methode gehört nur zu ihrer Klasse und zu keinem Objekt oder einer beliebigen Instanz.

Wenn Sie also versuchen, von einer statischen Methode innerhalb derselben Klasse auf eine nicht statische Methode zuzugreifen, erhalten Sie:

"Für das nicht statische Feld, die Methode oder die Eigenschaft ist eine Objektreferenz erforderlich."

Lösung: Deklarieren Sie einfach eine Referenz wie:

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

non-static method()
{

}


}
Angad
quelle
-1

Sie können die Aufrufmethode folgendermaßen verwenden: 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();
    }
}
박병학
quelle
-2

Unter der Annahme, dass beide data1()und data2()in derselben Klasse sind, besteht eine andere Alternative darin, data1()statisch zu machen .

private static void data1()
{
}
private static void data2()
{
   data1();
}
Theophilus
quelle
Das ist keine Antwort oder Lösung für diese Frage.
Eru