2013-10-26 5 views
5

तत्काल बिना किसी वर्ग प्रकार को सक्रियकर्ता के साथ तुरंत चालू किया जा सकता है, वर्तमान में जब मेरे पास कक्षा का प्रकार होता है और यह जानने की आवश्यकता होती है कि कक्षा बनाई जा सकती है या नहीं। मैं Activator.CreateInstance(type); पर कॉल करूंगा और परिणाम निकाल दूंगा।परीक्षण करें यदि कक्षा वर्ग को

यह बहुत अक्षम और समस्याग्रस्त प्रतीत होता है।

क्या यह पुष्टि करने का कोई वैकल्पिक तरीका है कि वर्तमान एप्लिकेशन के लिए कक्षा प्रकार को तुरंत चालू किया जा सकता है?

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

यहां मैं अभी क्या कर रहा हूं।

 string className = string.Format("Package.{0}.{1}", pArg1, pArg2); 
     Type classType = Type.GetType(className); 
     if (classType == null) 
     { 
      throw new Exception(string.Format("Class not found: {0}", className)); 
     } 

     try 
     { 
      // test creating an instance of the class. 
      Activator.CreateInstance(classType); 
     } 
     catch (Exception e) 
     { 
      logger.error("Could not create {0} class.", classType); 
     } 

उत्तर

6

क्या here पाया जा सकता है के आधार पर, आप चाहे प्रकार एक parameterless निर्माता (जो कक्षाओं डिफ़ॉल्ट रूप से जब नहीं प्रदान की जाएगी) शामिल हैं परीक्षण कर सकते हैं, और क्या प्रकार सार नहीं है:

if(classType.GetConstructor(Type.EmptyTypes) != null && !classType.IsAbstract) 
{ 
    //this type is constructable with default constructor 
} 
else 
{ 
    //no default constructor 
} 
1

System.Runtime.Serialization.FormatterServices.GetUninitializedObject(type) का उपयोग ऑब्जेक्ट को तुरंत चालू करेगा लेकिन कन्स्ट्रक्टर पर कॉल नहीं करेगा। यह कक्षा के शून्य से बाहर उदाहरण प्रस्तुत करता है। कक्षा सुलभ होनी चाहिए या अपवाद फेंक दिया जाना चाहिए। यदि आपकी कक्षा में वर्बोज़ स्टार्टअप कोड है तो यह दक्षता में सुधार कर सकता है।

+0

यह एक अच्छा तरीका है। धन्यवाद। – cgTag

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