7

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

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

在单例模型中,我只需使用以下内容对其进行更新:

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

然而,这在课堂上是不可能的Shared。有什么想法可以做到这一点吗?还是我应该切换单例?

4

5 回答 5

9

没有办法以与您刚刚指出的单例模型相同的方式做到这一点。原因是没有“重置”的后备数据存储。但是,您可以做的是通过使用显式方法来初始化我们所有的数据来模拟这一点。

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
于 2009-05-04T17:54:15.137 回答
5

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

这两个选项是切换(返回)到单例。

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

于 2009-05-04T17:53:44.187 回答
2

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

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;
    }
}
于 2014-11-18T10:49:51.787 回答
1

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

于 2009-05-04T17:54:09.257 回答
0
  • 执行时间方面的快速方法是使用重置每个值的方法来重置值。

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

如果您的静态类具有特殊的初始化属性/字段,请使用一种方法来初始化这些字段,即第一种方法。

如果您的静态类具有空值/默认初始化属性/字段,请使用反射遍历所有数据成员并将它们重置为默认值。

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

此代码重置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并执行相同的循环来重置它们。

于 2018-01-13T11:00:10.213 回答