문제

나는 가지고있다 shared 수업 (static C#)에서는 대부분 응용 프로그램의 클래스가 읽고 때로는 쓸 수있는 일부 설정 데이터를 전달합니다. 또한 일부 내부 상태를 보유하는 정적 특성이 있습니다.

이제이 클래스를 초기 단계로 되돌리고 싶습니다. 모든 기본 변수 등이 있습니다. 사용자가 현재 상태를 재설정하고 애플리케이션을 다시 시작하지 않고 다시 시작한다고 가정하십시오.

싱글 톤 모델에서는 다음과 같은 것으로 간단히 갱신합니다.

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

그러나 이것은 a에서는 불가능합니다 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/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 또한 재설정하기 위해 동일한 루프를 수행하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top