2009-05-04 6 views
5

मुझे shared कक्षा (static सी # में) मिली है, जिसमें ज्यादातर सेटिंग्स डेटा होते हैं जो एप्लिकेशन में कोई भी वर्ग पढ़ और कभी-कभी लिख सकता है। इसके अलावा कुछ स्थिर गुण हैं जिनमें कुछ आंतरिक राज्य हैं।क्या मैं एक स्थिर/साझा कक्षा को रीसेट कर सकता हूं?

अब मैं इस कक्षा को प्रारंभिक चरण में वापस करना चाहता हूं। सभी डिफ़ॉल्ट चर आदि के साथ मान लें कि उपयोगकर्ता वर्तमान स्थिति को रीसेट करना चाहते हैं और एप्लिकेशन को पुनरारंभ किए बिना शुरू करना चाहते हैं।

एक सिंगलटन मॉडल में मैं बस कुछ इस तरह के साथ उसे नवीनीकृत चाहते हैं:

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

हालांकि यह एक Shared कक्षा में संभव नहीं है। क्या इस बारे में कोई विचार है कि मैं इसे कैसे पूरा कर सकता हूं? या मुझे सिंगलटन में वापस स्विच करना चाहिए?

उत्तर

7

उसी तरह से ऐसा करने का कोई तरीका नहीं है जैसा कि आपने सिंगलटन मॉडल को अभी बताया है। इसका कारण यह है कि "रीसेट" करने के लिए कोई बैकिंग डेटा स्टोर नहीं है। हालांकि आप हमारे सभी डेटा को आरंभ करने के लिए एक स्पष्ट विधि का उपयोग कर ऐसा कर सकते हैं।

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

मुझे लगता है कि यह एक उचित दृष्टिकोण है, मैं भूल रहा हूं कि मैं "साझा नया()" कर सकता हूं –

3

आप इसे स्थैतिक वर्ग में नहीं कर सकते हैं, क्योंकि स्थैतिक वर्ग का कोई उदाहरण नहीं है।

दो विकल्प स्विच (बैक) को सिंगलटन में स्विच करना होगा।

वैकल्पिक रूप से, आपके पास एक विधि हो सकती है जो कक्षा के प्रत्येक स्थिर सदस्यों को रीसेट करता है।

1

हो सकता है कि एक स्थिर विधि जिसे कॉल किया जाता है, सभी वैरिएबल को डिफ़ॉल्ट पर रीसेट करता है।

0

आप स्थिर वर्ग जो सभी गुण के मूल्यों को रीसेट करता है में एक विधि बना सकते हैं बनाम एक वर्ग के साथ संस्करण। पर विचार आप एक स्थिर वर्ग

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; 
    } 
} 
0
  • निष्पादन समय के मामले में तेजी से दृष्टिकोण एक विधि है कि प्रत्येक मूल्य को रीसेट करता है का उपयोग कर मान रीसेट करने के लिए है।

  • यदि आप कोडिंग समय को सहेजना चाहते हैं और एक बग फ्री कोड लिखना चाहते हैं तो प्रतिबिंब का उपयोग करें। यदि आपकी स्थैतिक कक्षा में कई स्थैतिक क्षेत्र हैं, तो प्रतिबिंब का उपयोग करके संपत्ति या क्षेत्र को खोने का मौका कम हो जाता है।

अगर आपके स्थिर वर्ग विशेष initialized गुण है/क्षेत्रों उन क्षेत्रों, यानी पहले दृष्टिकोण को प्रारंभ करने के लिए एक विधि का उपयोग करें।

यदि आपकी स्थिर श्रेणी में शून्य/डिफ़ॉल्ट प्रारंभिक गुण/फ़ील्ड सभी डेटा सदस्यों पर पुनरावृत्ति करने के लिए प्रतिबिंब का उपयोग करते हैं और उन्हें डिफ़ॉल्ट मान पर रीसेट करते हैं।

बचत समय कोडिंग और बग पेश करने की क्षमता को कम करने के लिए दोनों दृष्टिकोणों का मिश्रण का उपयोग करें।

यह कोड MyStaticClass के सभी क्षेत्रों को रीसेट करता है। फिर कम शेष क्षेत्रों को शुरू करने के लिए इनिट विधि को कॉल करें।

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 रूप में अच्छी तरह फोन और उन्हें पुनर्स्थापित करने के लिए एक ही पाश है।

संबंधित मुद्दे

 संबंधित मुद्दे