Kann ich eine statische / shared Klasse zurücksetzen?
Frage
Ich habe eine shared
Klasse (static
in C #) bekam die meist einige Einstellungsdaten trägt, dass jede Klasse in der Anwendung lesen und manchmal schreiben. Auch gibt es einige statische Eigenschaften, die einige interne Zustände hält.
Jetzt möchte ich diese Klasse Anfangsstadium davon zurückzukehren. Bei allen Standardgrößen usw. Angenommen, der Benutzer den aktuellen Status zurücksetzen und neu beginnen möchten, ohne die Anwendung neu zu starten.
In einem Singleton-Modell würde ich einfach erneuern sie mit so etwas wie folgt aus:
Public Sub Reset()
_Instance = New MyClass()
End Sub
Dies ist jedoch in einer Shared
Klasse nicht möglich. Gibt es eine Idee, wie kann ich das erreichen? Oder sollte ich wechseln zurück zu Singleton?
Lösung
Es gibt keinen Weg, um es auf die gleiche Weise das Singleton-Modell zu tun Sie gerade aufgezeigt. Der Grund dafür ist, dass es keine Unterstützung Datenspeicher ist auf „Reset“. Was Sie tun können, ist, obwohl dies simulieren, indem eine explizite Methode alle unsere Daten zu initialisieren.
Public Module MyClass
Public Sub Reset()
Field1 = 42
Field2 = "foo"
End Sub
Public Shared Field1 As Integer
Public Shared Field2 As String
End Module
Version mit einer Klasse im Vergleich zu einem Modul
Public Class MyClass
Shared Sub New()
Reset
End Sub
Private Sub New()
' Prevent instantiation of the class
End Sub
Public Sub Reset()
Field1 = 42
Field2 = "foo"
End Sub
Public Shared Field1 As Integer
Public Shared Field2 As String
End Class
Andere Tipps
Sie können dies nicht in einer statischen Klasse, da es keine Instanz einer statischen Klasse ist.
Die beiden Optionen wären zu wechseln (zurück) zu einem Singleton.
Alternativ könnten Sie eine Methode, die jede der statischen Elemente der Klasse zurücksetzt.
Vielleicht eine statische Methode, die, wenn sie aufgerufen, setzt alle die Variable auf Standardwerte.
Sie können eine Methode in der statischen Klasse erstellen, die die Werte aller Eigenschaften zurücksetzt. Betrachten Sie haben eine statische Klasse
public static class ClassA
{
public static int id=0;
public static string name="";
public static void ResetValues()
{
// Here you want to reset to the old initialized value
id=0;
name="";
}
}
Jetzt können Sie die unten aufgeführten verwenden, um von einer anderen Klasse nähert sich Wert einer statischen Klasse zurückgesetzt
Ansatz 1 - Aufruf direkt
ClassA.ResetValues();
Ansatz 2 - Aufrufe Methode dynamisch von einem bekannten Namensraum und bekannte Klasse
Type t1 = Type.GetType("Namespace1.ClassA");
MethodInfo methodInfo1 = t1.GetMethod("ResetValues");
if (methodInfo1 != null)
{
object result = null;
result = methodInfo1.Invoke(null, null);
}
Ansatz 3 - Aufrufe der Methode dynamisch von einer Anordnung / Satz von Baugruppen
foreach (var Ass in AppDomain.CurrentDomain.GetAssemblies())
{
// Use the above "If" condition if you want to filter from only one Dll
if (Ass.ManifestModule.FullyQualifiedName.EndsWith("YourDll.dll"))
{
List<Type> lstClasses = Ass.GetTypes().Where(t => t.IsClass && t.IsSealed && t.IsAbstract).ToList();
foreach (Type type in lstClasses)
{
MethodInfo methodInfo = type.GetMethod("ResetValues");
if (methodInfo != null)
{
object result = null;
result = methodInfo.Invoke(null, null);
}
}
break;
}
}
-
Eil- hinsichtlich der Ausführungszeit ist Werte unter Verwendung eines Verfahrens zum Zurücksetzen, die jeden Wert zurücksetzt.
-
Reflektion verwenden, wenn Sie Codierung Zeit zu sparen und einen fehlerfreien Code zu schreiben. wenn Ihre statische Klasse viele statische Felder hat, mithilfe von Reflektion reduziert Chance auf eine Eigenschaft oder ein Feld fehlt.
Wenn Sie Ihre statische Klasse spezielle initialisierte Eigenschaften / Felder verwenden, um eine Methode, diese Felder zu initialisieren, das heißt ersten Ansatz.
Wenn Sie Ihre statische Klasse hat null / default initialisiert Eigenschaften / Felder verwenden Reflexion alle Datenelemente iterieren und setzen Sie sie auf den Standardwert.
Nutzung Mischung beiden Ansätze zur Codierung Zeit sparen und das Potenzial reduzieren Fehler einzuführen.
Dieser Code setzt alle Felder von MyStaticClass
. ruft dann Init-Methode weniger Rest der Felder zu initialisieren.
var fields = typeof(MyStaticClass).GetFields(BindingFlags.Static | BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Public);
foreach (var field in fields)
{
var type = field.GetType();
field.SetValue(null, null);
}
Init(); // if there are values to be initialized
Wenn Sie Ihre statische Klasse Eigenschaften hat, rufen GetProperties
auch und das gleiche tun Schleife sie zurückgesetzt werden.