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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top