Question

J'ai une classe partagée ( statique en C #), qui contient principalement des données de paramètres que toute classe de l'application peut lire et parfois écrire. De plus, certaines propriétés statiques contiennent des états internes.

Je souhaite maintenant que cette classe revienne à son stade initial. Avec toutes les variables par défaut, etc. Supposons que l'utilisateur souhaite réinitialiser l'état actuel et recommencer sans redémarrer l'application.

Dans un modèle singleton, je le renouvellerais simplement avec quelque chose comme ceci:

Public Sub Reset() 
    _Instance = New MyClass()
End Sub

Toutefois, cela n'est pas possible dans une classe Shared . Y a-t-il une idée sur comment puis-je accomplir cela? Ou devrais-je changer de retour à Singleton?

Était-ce utile?

La solution

Il n’ya aucun moyen de le faire de la même manière que le modèle de singleton que vous venez de souligner. La raison en est qu'il n'y a pas de magasin de données de sauvegarde pour "réinitialiser". Ce que vous pouvez faire est simulé en utilisant une méthode explicite pour initialiser toutes nos données.

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 avec une classe ou un module

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

Autres conseils

Vous ne pouvez pas faire cela dans une classe statique, car il n'y a pas d'instance de classe statique.

Les deux options seraient de basculer (de nouveau) sur un singleton.

Vous pouvez également utiliser une méthode qui réinitialise chacun des membres statiques de la classe.

Peut-être une méthode statique qui, lorsqu'elle est appelée, réinitialise toutes les variables aux valeurs par défaut.

Vous pouvez créer une méthode dans la classe statique qui réinitialise les valeurs de toutes les propriétés. Considérez que vous avez une classe statique

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="";
     }
}

Vous pouvez maintenant utiliser l'une des approches ci-dessous à partir de n'importe quelle autre classe pour réinitialiser la valeur d'une classe statique

Approche 1 - Appeler directement

ClassA.ResetValues();

Approche 2 - Appel de méthode de manière dynamique à partir d'un espace de noms et d'une classe connus

Type t1 = Type.GetType("Namespace1.ClassA");
MethodInfo methodInfo1 = t1.GetMethod("ResetValues");
if (methodInfo1 != null)
{
     object result = null;
     result = methodInfo1.Invoke(null, null);                
}

Approche 3 - Invocation dynamique d'une méthode à partir d'un assemblage / d'un ensemble d'assemblages

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;
    }
}
  • L’approche rapide en termes de temps d’exécution consiste à réinitialiser les valeurs à l’aide d’une méthode qui réinitialise chaque valeur.

  • utilisez la réflexion si vous voulez économiser du temps de codage et écrire un code sans bug. si votre classe statique comporte de nombreux champs statiques, l’utilisation de la réflexion réduit le risque de manquer une propriété ou un champ.

si votre classe statique a des propriétés / champs initialisés spéciaux, utilisez une méthode pour initialiser ces champs, c'est-à-dire la première approche.

si votre classe statique a des propriétés / champs initialisés null / default, utilisez la réflexion pour parcourir tous les membres de données et les réinitialiser à la valeur par défaut.

En combinant les deux méthodes de codage, vous gagnez du temps et réduisez le risque d’introduction de bogues.

Ce code réinitialise tous les champs de MyStaticClass . appelle ensuite la méthode Init pour initialiser moins de reste de champs.

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

si votre classe statique a des propriétés, appelez GetProperties également et faites la même boucle pour les réinitialiser.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top