Pergunta

Eu tenho uma classe shared (static em C #), que em sua maioria carrega alguns dados de configuração que qualquer classe no aplicativo pode ler e às vezes escrevo. Além disso, existem algumas propriedades estáticas que detém alguns estados internos.

Agora eu quero reverter essa classe para fase inicial do mesmo. Com todas as variáveis ??padrão etc. Suponha que o usuário deseja redefinir o estado atual e começar de novo sem reiniciar o aplicativo.

Em um modelo singleton eu simplesmente renová-lo com algo parecido com isto:

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

No entanto, isto não é possível em uma classe Shared. Existe alguma idéia de como posso fazer isso? Ou eu deveria mudar Voltar para Singleton?

Foi útil?

Solução

Não há nenhuma maneira de fazê-lo da mesma forma o modelo singleton você só apontou. A razão é que não há armazenamento de dados de apoio ao "reset". O que você pode fazer, porém, é simular isso usando um método explícito para inicializar todos os nossos dados.

Public Module MyClass

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

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

Versão com uma classe vs. um módulo

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

Outras dicas

Você não pode fazer isso em uma classe estática, uma vez que não há nenhuma instância de uma classe estática.

As duas opções seria a de switch (volta) a um singleton.

Como alternativa, você poderia ter um método que redefine cada um dos membros estáticos da classe.

Talvez um método estático que, quando chamado, repõe todas as variáveis ??para os padrões.

Você pode criar um método na classe estática que repõe os valores de todas as propriedades. Considere que você tem uma classe estática

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

Agora você pode usar qualquer um dos abaixo se aproxima de qualquer outra classe para redefinir o valor de uma classe estática

Abordagem 1 - Chamando diretamente

ClassA.ResetValues();

Abordagem 2 - método Invocando dinamicamente a partir de um espaço de nomes conhecidos e classe conhecida

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

Abordagem 3 - método A invocação dinamicamente a partir de uma montagem / jogo de conjuntos

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;
    }
}
  • abordagem rápida em termos de tempo de execução é para repor os valores usando um método que redefine cada valor.

  • uso de reflexão, se você quiser economizar tempo de codificação e escrever um código livre de bugs. se sua classe estática tem muitos campos estáticos, usando a reflexão reduz a chance de perder uma propriedade ou campo.

Se a sua classe estática tem propriedades inicializados especiais / campos usar um método para inicializar os campos, i primeira abordagem.

Se a sua classe estática tem nulo / propriedades padrão inicializado / campos usar a reflexão para iterar sobre todos os membros de dados e redefini-las para o valor padrão.

uso mistura de ambos abordagens de codificação de economizar tempo e reduzir o potencial de introdução de bugs.

Este código repõe todos os campos da MyStaticClass. em seguida, chama o método Init para inicializar menos resto de campos.

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 a sua classe estática tem propriedades, GetProperties chamada bem e fazer o mesmo loop para redefini-las.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top