题
我有一个 shared
班级 (static
在 C# 中),它主要携带一些应用程序中的任何类都可以读取(有时也可以写入)的设置数据。还有一些静态属性保存一些内部状态。
现在我想将这个类恢复到它的初始阶段。具有所有默认变量等。 假设用户想要重置当前状态并重新开始而不重新启动应用程序。
在单例模型中,我只需使用如下内容更新它:
Public Sub Reset()
_Instance = New MyClass()
End Sub
然而,这在 Shared
班级。我有什么想法可以做到这一点吗?或者我应该切换 后退 到辛格尔顿?
解决方案
没有办法像你刚才指出的单身模型那样做。原因是没有后备数据存储来“重置”。你可以做的是通过使用显式方法来初始化我们的所有数据来模拟这个。
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
其他提示
您不能在静态类中执行此操作,因为没有静态类的实例。
两个选项是切换(返回)单身。
或者,你可以有一个方法来重置该类的每个静态成员。
可能是一个静态方法,在调用时,将所有变量重置为默认值。
您可以在静态类中创建一个方法,该方法会重置所有属性的值。 考虑你有一个静态类
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;
}
}
就执行时间而言,快速方法是使用重置每个值的方法来重置值。
如果您想节省编码时间并编写无错误的代码,请使用反射。如果您的静态类有许多静态字段,则使用反射可以减少丢失属性或字段的机会。
如果您的静态类具有特殊的初始化属性/字段,请使用一种方法来初始化这些字段,即第一种方法。
如果您的静态类具有 null/默认初始化属性/字段,请使用反射来迭代所有数据成员并将它们重置为默认值。
混合使用两种编码方法可以节省时间并减少引入错误的可能性。
此代码重置所有字段 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
以及执行相同的循环来重置它们。