C# 我可以重置静态/共享类吗?
我有一个C# 我可以重置静态/共享类吗?,c#,.net,vb.net,static,shared,C#,.net,Vb.net,Static,Shared,我有一个shared类(staticin C#),它主要携带一些设置数据,应用程序中的任何类都可以读取,有时也可以写入。还有一些静态属性,它包含一些内部状态 现在我想把这个类还原到它的初始阶段。对于所有默认变量等,假设用户希望重置当前状态并在不重新启动应用程序的情况下重新启动 在单例模型中,我只需使用以下内容更新它: Public Sub Reset() _Instance = New MyClass() End Sub 但是,这在共享类中是不可能的。你知道我怎样才能做到这一点吗?或
shared
类(static
in C#),它主要携带一些设置数据,应用程序中的任何类都可以读取,有时也可以写入。还有一些静态属性,它包含一些内部状态
现在我想把这个类还原到它的初始阶段。对于所有默认变量等,假设用户希望重置当前状态并在不重新启动应用程序的情况下重新启动
在单例模型中,我只需使用以下内容更新它:
Public Sub Reset()
_Instance = New MyClass()
End Sub
但是,这在
共享类中是不可能的。你知道我怎样才能做到这一点吗?或者我应该切换回Singleton吗?在静态类中不能这样做,因为没有静态类的实例
这两个选项是切换(返回)到单一模式
或者,您可以有一个方法来重置类的每个静态成员。可能是一个静态方法,当调用时,它会将所有变量重置为默认值。没有办法像您刚才指出的单例模型那样做。原因是没有可“重置”的备份数据存储。您可以通过使用显式方法初始化所有数据来模拟这一点
公共模块MyClass
公共子重置()
字段1=42
Field2=“foo”
端接头
公共共享字段1为整数
公共共享字段2作为字符串
端模块
类版本与模块版本
公共类MyClass
共享子新()
重置
端接头
私人分新
'防止类的实例化
端接头
公共子重置()
字段1=42
Field2=“foo”
端接头
公共共享字段1为整数
公共共享字段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="";
}
}
现在,您可以从任何其他类使用以下任何方法来重置静态类的值
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);
}
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;
}
}
方法3-从程序集/程序集动态调用方法
Type t1 = Type.GetType("Namespace1.ClassA");
MethodInfo methodInfo1 = t1.GetMethod("ResetValues");
if (methodInfo1 != null)
{
object result = null;
result = methodInfo1.Invoke(null, null);
}
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;
}
}
foreach(AppDomain.CurrentDomain.getAssemblys()中的var Ass)
{
//如果只想从一个Dll进行筛选,请使用上述“如果”条件
if(Ass.ManifestModule.FullyQualifiedName.EndsWith(“YourDll.dll”))
{
List lstClasses=Ass.GetTypes()。其中(t=>t.IsClass&&t.IsSealed&&t.isasastract).ToList();
foreach(类中的类型)
{
MethodInfo MethodInfo=type.GetMethod(“ResetValues”);
如果(methodInfo!=null)
{
对象结果=空;
结果=methodInfo.Invoke(null,null);
}
}
打破
}
}
- 执行时间方面的快速方法是使用重置每个值的方法重置值
- 如果您想节省编码时间并编写无bug代码,请使用反射。如果您的静态类有许多静态字段,那么使用反射可以减少丢失属性或字段的机会
如果静态类具有特殊的初始化属性/字段,请使用方法初始化这些字段,即第一种方法
如果静态类具有null/default初始化属性/字段,请使用反射迭代所有数据成员并将其重置为默认值
混合使用这两种方法可以节省时间并减少引入bug的可能性
此代码重置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
,并执行相同的循环来重置它们。我认为这是一种合理的方法,我一直忘记我可以执行“Shared New()