2010-04-19 16 views
6

में ऑब्जेक्ट्स बनाना जो मैं करने की कोशिश कर रहा हूं वह एक्सएमएल सेव फ़ाइल से वस्तुओं में लोड होता है। समस्या यह है कि उपयोगकर्ता ऑब्जेक्ट द्वारा रनटाइम पर कॉन्फ़िगर करने योग्य हैं, जिसका अर्थ है कि मुझे XML फ़ाइल में संग्रहीत उन ऑब्जेक्ट्स के नाम और विशेषताओं को प्राप्त करने के लिए प्रतिबिंब का उपयोग करना था।आम तौर पर सी #

मैं एक्सएमएल के माध्यम से और ऊपर हिस्सा है जहां मैं एक वस्तु तो बनाने की जरूरत के लिए एक पुनरावर्ती पाश के बीच में हूँ सोचा ..... आह - पता नहीं कैसे करना है कि :(

मैं एक सरणी खाली वस्तुओं (m_MenuDataTypes) के साथ भरवां, प्रत्येक संभव प्रकार से एक है। मेरे पुनरावर्ती लोड हो रहा है समारोह इस

private void LoadMenuData(XmlNode menuDataNode) 
{ 
    foreach (object menuDataObject in m_MenuDataTypes) 
    { 
     Type menuDataObjectType = menuDataObject.GetType(); 
     if (menuDataObjectType.Name == menuDataNode.Name) 
     { 
      //create object 
     } 
    } 
} 

मैं कहाँ मेरी टिप्पणी है कुछ कोड रखना होगा की तरह दिखता है, लेकिन मैं एक बड़ा स्विच नहीं कर सकते हैं कथन या कुछ भी। मेरे सरणी में ऑब्जेक्ट्स इस बात के आधार पर बदल सकते हैं कि उपयोगकर्ता ने ऐप को कैसे कॉन्फ़िगर किया है।

+0

क्या हम उस एक्सएमएल का एक टुकड़ा देख सकते हैं? – devnull

+0

मैं @devnull echo - क्या हम एक्सएमएल देख सकते हैं, कृपया? –

+0

मैं सच में इसे पोस्ट नहीं कर सकते, क्योंकि यह पूरी तरह से दूर कर देता है क्या अनुप्रयोग है और इस कंपनी कोड है - खेद लोग जैसे fishtank मछली कैटफ़िश sexual_orientation = "अच्छी तरह से समलैंगिक"/ dogfish special_abilities अपने सामान्य आंतरिक संरचना की कल्पना = "बांसुरी बजाता है"/ /मछली /फिशटैंक उस तरह की चीज – DrLazer

उत्तर

13

आप Activator.CreateInstance(Type)

object instance = Activator.CreateInstance(menuDataObjectType); 

इस कुशलता से काम करने के लिए, आप एक इंटरफेस

ICommonInterface i = (ICommonInterface)Activator.CreateInstance(menuDataObjectType) 

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

+1

यदि सक्रियकर्ता एक प्रकार का "ऑब्जेक्ट" देता है तो क्या यह इसके वास्तविक प्रकार के लिए उपयुक्त है? उदाहरण के लिए, अगर मैंने इसे सिर्फ ऐरेलिस्ट में भर दिया है तो क्या मैं कुछ ऐसा कर सकता हूं (ऑब्जेक्ट [4] टर्बोबटन है)? – DrLazer

+1

लौटाई गई वस्तु उस प्रकार का उदाहरण है जिसे आपने CreateInstance में पारित किया था। आप इसे अपने प्रकार पर वापस ला सकते हैं। (या ऑपरेटर का उपयोग करें, आदि)। CreateInstance के कई अधिभार हैं जिन्हें आपको देखना चाहिए - जिसमें एक स्ट्रिंग प्रकार का नाम और एक स्ट्रिंग असेंबली नाम स्वीकार करता है। – JMarsch

+0

अच्छा एक – DrLazer

2

आप वस्तुओं की एक ग्राफ instantiating कर रहे हैं, XmlSerializer या DataContractSerializer अधिक उचित होगा?

+0

हाँ यह एक अच्छा विचार है - मुझे इसके लिए आसानी से मानव पठनीय होने की आवश्यकता है हालांकि: '( – DrLazer

+0

यदि आप पर्याप्त विवरण निर्दिष्ट करते हैं तो यह साफ और साफ नहीं होना चाहिए अपने वर्गों के गुणों में। –

+0

प्लस ऐप में पहले से ही अन्य कार्यक्षमता का एक भार है जो उन एक्सएमएल फाइलों के साथ अन्य पीपों द्वारा काम किया जा रहा है - आपको दरार पता है। अगर यह मेरे ऊपर था तो हम इसे एन्क्रिप्टेड के रूप में सहेज लेंगे गैश – DrLazer

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