2009-05-04 29 views
5

Tôi có một lớp học shared (static trong C#), chủ yếu mang một số dữ liệu cài đặt mà bất kỳ lớp nào trong ứng dụng có thể đọc và đôi khi viết. Ngoài ra còn có một số thuộc tính tĩnh giữ một số trạng thái bên trong.Tôi có thể đặt lại lớp tĩnh/chia sẻ không?

Bây giờ tôi muốn hoàn nguyên lớp này về giai đoạn ban đầu của nó. Với tất cả các biến mặc định, vv Giả sử rằng người dùng muốn đặt lại trạng thái hiện tại và bắt đầu lại mà không cần khởi động lại ứng dụng.

Trong một mô hình singleton tôi chỉ đơn giản là làm mới nó với một cái gì đó như thế này:

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

Tuy nhiên điều này là không thể trong một lớp học Shared. Có ý tưởng nào về cách tôi có thể thực hiện việc này không? Hoặc tôi có nên chuyển đổi trở lại thành Singleton không?

Trả lời

7

Không có cách nào để làm điều đó theo cách tương tự như mô hình singleton bạn vừa chỉ ra. Lý do là không có kho lưu trữ dữ liệu sao lưu để "đặt lại". Những gì bạn có thể làm là mô phỏng điều này bằng cách sử dụng một phương thức tường minh để khởi tạo tất cả dữ liệu của chúng tôi.

Public Module MyClass 

    Public Sub Reset() 
    Field1 = 42 
    Field2 = "foo" 
    End Sub 

    Public Shared Field1 As Integer 
    Public Shared Field2 As String 
End Module 

Phiên bản với một lớp so với một mô-đun

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 
+0

Tôi nghĩ rằng đây là một cách tiếp cận hợp lý, tôi tiếp tục quên rằng tôi có thể làm "Shared New()" –

3

Bạn không thể làm điều này trong một lớp tĩnh, vì không có thể hiện của một lớp tĩnh.

Hai tùy chọn sẽ là chuyển (quay lại) thành một bản đơn.

Hoặc, bạn có thể có phương thức đặt lại từng thành viên tĩnh của lớp.

1

Có thể là phương pháp tĩnh khi được gọi, đặt lại tất cả biến thành mặc định.

0

Bạn có thể tạo ra một phương thức trong lớp tĩnh mà resets các giá trị của tất cả các tài sản. xem xét bạn có một lớp tĩnh

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=""; 
    } 
} 

Bây giờ bạn có thể sử dụng bất kỳ bên dưới cách tiếp cận từ bất kỳ lớp khác để thiết lập lại giá trị của một lớp tĩnh

Cách tiếp cận 1 - Gọi trực tiếp

ClassA.ResetValues(); 

Cách tiếp cận 2 - Phương pháp gọi tự động từ không gian tên đã biết và lớp đã biết

Type t1 = Type.GetType("Namespace1.ClassA"); 
MethodInfo methodInfo1 = t1.GetMethod("ResetValues"); 
if (methodInfo1 != null) 
{ 
    object result = null; 
    result = methodInfo1.Invoke(null, null);     
} 

Cách tiếp cận 3 - Phương pháp Gọi tự động từ một hội đồng/bộ lắp ráp

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; 
    } 
} 
0
  • cách tiếp cận nhanh chóng về thời gian thực hiện là để thiết lập lại giá trị sử dụng một phương pháp mà reset mỗi giá trị.

  • sử dụng phản ánh nếu bạn muốn tiết kiệm thời gian mã hóa và viết mã lỗi miễn phí. nếu lớp tĩnh của bạn có nhiều trường tĩnh, việc sử dụng sự phản chiếu làm giảm cơ hội thiếu một thuộc tính hoặc trường.

nếu lớp tĩnh của bạn có thuộc tính/trường được khởi tạo đặc biệt sử dụng phương pháp để khởi tạo các trường đó, tức là cách tiếp cận đầu tiên.

nếu lớp tĩnh của bạn có các thuộc tính/trường mặc định rỗng/mặc định sử dụng phản chiếu để lặp qua tất cả các thành viên dữ liệu và đặt lại thành giá trị mặc định.

sử dụng kết hợp cả hai cách tiếp cận để mã hóa tiết kiệm thời gian và giảm khả năng giới thiệu lỗi.

Mã này đặt lại tất cả các trường của MyStaticClass. sau đó gọi phương thức Init để khởi tạo ít trường còn lại.

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 

nếu lớp tĩnh của bạn có thuộc tính, hãy gọi GetProperties và thực hiện cùng một vòng lặp để đặt lại.

Các vấn đề liên quan