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?
publicclassSingleton
{
privateSingleton() {}
publicvoidDoWork()
{
// do something
}
// You can call this static method which calls the singleton instance method.publicstaticvoidDoSomeWork()
{
Instance.DoWork();
}
publicstatic Singleton Instance
{
get { return instance; }
}
privatestatic Singleton instance = new Singleton();
}
Sie müssen noch eine Instanz der Klasse erstellen, stellen jedoch sicher, dass nur eine Instanz vorhanden ist.
+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:
publicclassMyClass
{
privatevoiddata1()
{
}
privatestaticvoiddata2()
{
MyClass c = new MyClass();
c.data1();
}
}
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.
publicclassMyClass
{
privatestatic Action NonStaticDelegate;
publicvoidNonStaticMethod()
{
Console.WriteLine("Non-Static!");
}
publicstaticvoidCaptureDelegate()
{
MyClass temp = new MyClass();
MyClass.NonStaticDelegate = new Action(temp.NonStaticMethod);
}
publicstaticvoidRunNonStaticMethod()
{
if (MyClass.NonStaticDelegate != null)
{
// This will run the non-static method.// Note that you still needed to create an instance beforehand
MyClass.NonStaticDelegate();
}
}
}
Antworten:
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(); } }
quelle
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.
quelle
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(); } }
quelle
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.
quelle
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(); }
quelle
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(); } } }
quelle
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() { } }
quelle
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
Unter der Annahme, dass beide
data1()
unddata2()
in derselben Klasse sind, besteht eine andere Alternative darin,data1()
statisch zu machen .private static void data1() { } private static void data2() { data1(); }
quelle