Domanda

Ho una classe condivisa ( statico in C #) che contiene principalmente alcuni dati di impostazione che qualsiasi classe dell'applicazione può leggere e talvolta scrivere. Inoltre ci sono alcune proprietà statiche che contengono alcuni stati interni.

Ora voglio riportare questa classe al suo stadio iniziale. Con tutte le variabili predefinite ecc. Supponiamo che l'utente desideri ripristinare lo stato corrente e ricominciare da capo senza riavviare l'applicazione.

In un modello singleton lo rinnoverei semplicemente con qualcosa del genere:

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

Tuttavia ciò non è possibile in una classe Shared . C'è qualche idea su come posso realizzare questo? O dovrei passare da indietro a Singleton?

È stato utile?

Soluzione

Non c'è modo di farlo allo stesso modo del modello singleton che hai appena sottolineato. Il motivo è che non esiste un archivio di dati di backup per "ripristinare". Quello che potresti fare è simularlo utilizzando un metodo esplicito per inizializzare tutti i nostri dati.

Public Module MyClass

  Public Sub Reset()
    Field1 = 42
    Field2 = "foo"
  End Sub

  Public Shared Field1 As Integer
  Public Shared Field2 As String
End Module

Versione con una classe rispetto a un modulo

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

Altri suggerimenti

Non puoi farlo in una classe statica, poiché non esiste un'istanza di una classe statica.

Le due opzioni sarebbero di passare (indietro) a un singleton.

In alternativa, potresti avere un metodo che reimposta ciascuno dei membri statici della classe.

Forse un metodo statico che, quando chiamato, reimposta tutte le variabili sui valori predefiniti.

È possibile creare un metodo nella classe statica che reimposta i valori di tutte le proprietà. Considera di avere una classe statica

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

Ora puoi utilizzare uno qualsiasi degli approcci seguenti di qualsiasi altra classe per ripristinare il valore di una classe statica

Approccio 1 - Chiamare direttamente

ClassA.ResetValues();

Approccio 2 - Richiamo del metodo in modo dinamico da uno spazio dei nomi noto e una classe nota

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

Approccio 3 - Richiamo del metodo in modo dinamico da un assembly / set di assembly

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'approccio rapido in termini di tempo di esecuzione consiste nel ripristinare i valori utilizzando un metodo che reimposta ciascun valore.

  • usa la riflessione se vuoi risparmiare tempo di programmazione e scrivere un codice privo di bug. se la tua classe statica ha molti campi statici, l'utilizzo di reflection riduce la possibilità di perdere una proprietà o un campo.

se la tua classe statica ha proprietà / campi inizializzati speciali usa un metodo per inizializzare quei campi, cioè il primo approccio.

se la tua classe statica ha proprietà / campi null / default inizializzati usa la riflessione per scorrere su tutti i membri dei dati e riportarli al valore predefinito.

usa la combinazione di entrambi gli approcci alla codifica per risparmiare tempo e ridurre il potenziale di introduzione di bug.

Questo codice reimposta tutti i campi di MyStaticClass . quindi chiama il metodo Init per inizializzare un numero inferiore di campi.

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

se la tua classe statica ha proprietà, chiama anche GetProperties e fai lo stesso ciclo per ripristinarle.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top