7

アプリケーション内の任意のクラスが読み書きできるいくつかの設定データを主に運ぶsharedクラス( C#)があります。staticまた、いくつかの内部状態を保持するいくつかの静的プロパティもあります。

ここで、このクラスを初期段階に戻したいと思います。すべてのデフォルト変数などを使用します。ユーザーが現在の状態をリセットし、アプリケーションを再起動せずに最初からやり直したいと想定します。

シングルトンモデルでは、次のようなもので更新するだけです:

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

静的クラスのインスタンスがないため、静的クラスでこれを行うことはできません。

2つのオプションは、シングルトンに切り替える(戻す)ことです。

または、クラスの各静的メンバーをリセットするメソッドを使用することもできます。

于 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 に答える