我可以重置静态/共享类吗?

时间:2009-05-04 17:49:49

标签: c# .net vb.net static shared

我有一个shared类(C#中的static),它主要带有一些设置数据,应用程序中的任何类都可以读取并有时写入。还有一些静态属性可以保存一些内部状态。

现在我想将这个类恢复到它的初始阶段。使用所有默认变量等。假设用户想要重置当前状态并重新开始而不重新启动应用程序。

在单身模型中,我只需用以下内容进行更新:

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

但是在Shared课程中这是不可能的。有什么想法我怎么能做到这一点?或者我应该将返回切换到Singleton?

5 个答案:

答案 0 :(得分:8)

没有办法像你刚才指出的单身模型那样做。原因是没有后备数据存储来“重置”。你可以做的是通过使用显式方法来初始化我们的所有数据来模拟这个。

Public Module MyClass

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

  Public Shared Field1 As Integer
  Public Shared Field2 As String
End 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

答案 1 :(得分:3)

您不能在静态类中执行此操作,因为没有静态类的实例。

两个选项是切换(返回)单身。

或者,你可以有一个方法来重置该类的每个静态成员。

答案 2 :(得分:1)

可能是一个静态方法,在调用时,将所有变量重置为默认值。

答案 3 :(得分:0)

您可以在静态类中创建一个方法,该方法会重置所有属性的值。 考虑你有一个静态类

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

现在,您可以使用任何其他类中的任何一种方法来重置静态类的值

方法1 - 直接致电

ClassA.ResetValues();

方法2 - 从已知的命名空间和已知类

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

方法3 - 从一个程序集/一组程序集动态调用方法

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

答案 4 :(得分:0)

  • 在执行时间方面的快速方法是使用重置每个值的方法重置值。

  • 如果您想节省编码时间并编写无错误代码,请使用反射。如果您的静态类有许多静态字段,则使用反射会减少错过属性或字段的可能性。

如果您的静态类具有特殊的初始化属性/字段,则使用方法初始化这些字段,即首先接近。

如果静态类具有null / default初始化属性/字段,则使用反射迭代所有数据成员并将其重置为默认值。

使用两种方法的混合来节省编码时间并减少引入错误的可能性。

此代码重置MyStaticClass的所有字段。然后调用Init方法初始化更少的其余字段。

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

如果您的静态类具有属性,请同时调用GetProperties并执行相同的循环以重置它们。