2009-03-17 12 views
5

मैं वस्तुओं की सूची के लिए फ़ाइल पूछने के लिए LINQ-to-XML का उपयोग कर रहा हूं। उनके सभी में एक ही संरचना है (विकल्पों की एक निश्चित संख्या, अनिश्चित लंबाई के पैरामीटर की एक सूची)। एक्सएमएल फ़ाइल में उनके नाम के आधार पर, मैं पूरी तरह से अलग-अलग चीजों के लिए पैरामीटर का उपयोग करना चाहता हूं - इसलिए मैंने इस ऑब्जेक्ट के उप-वर्ग बनाये।मैं सी # में एक रचनाकार गतिशील रूप से कैसे आ सकता हूं?

मेरा सवाल है - मैं केस कथन की तरह कुछ करने के बिना गतिशील रूप से सही कन्स्ट्रक्टर का आह्वान कैसे करूं? या एक्सएमएल से अलग-अलग उप-वर्गों को तत्काल तत्काल करने का समाधान कहीं और झूठ बोलता है?

class Object1 
{ 
    string name; 
    OptionObj opt; 
    List<Param> parameters; 
} 

class sonOfObject : Object1 
{ 
    public void ExecuteSomething() 
    { 
     //do something with the parameters 
    } 
} 

class secondSonOfObject : Object1 
{ 
    public void ExecuteSomething() 
    { 
     //do something entirely different with the parameters 
    } 
} 

var query = from x in xmlDoc.Descendants("Object") 
    select new Object 
    { 
     //select the object from the XML 
    } 

कोड के इस बिट के बाद मुझे एक प्रति निर्माता का उपयोग अधिक व्यापक क्वेरी वस्तु से एक sonOfObject बनाने के लिए कर सकता है। लेकिन मैं बाल वर्ग के नाम पर आधारित गतिशील रूप से कैसे करूं?

मुझे पता है कि आप एक प्रकार से MethodInfo हो और यह आह्वान आला कर सकते हैं ...

MethodInfo m = t.GetMethod(someName); 
m.Invoke(yourObj, null); 

लेकिन मतलब यह होगा कि मैं 9 या इन बच्चे वर्ग वस्तुओं की 10 का दृष्टांत करने के लिए होता है (और प्रकार मिलता है उनमें से प्रत्येक के लिए), और अभी भी किसी तरह के केस स्टेटमेंट में समाप्त होता है।

क्या बाल वर्ग रचनाकारों को गतिशील रूप से आमंत्रित करने का एक और शानदार तरीका है?

उत्तर

3

इस योजना में भाग लेने के लिए कक्षा के लिए, मैं इसे एक कस्टम विशेषता के साथ चिह्नित करूंगा, जो इसे "एक्सएमएल नाम" देता है।

फिर उस विशेषता के साथ चिह्नित सभी Type एस को खोजने के लिए प्रतिबिंब का उपयोग करें और उन्हें Dictionary<string, Type> में रखें। इस बिंदु पर आपको यह तय करने की ज़रूरत है कि आप अन्य असेंबली कैसे ढूंढेंगे जो सिस्टम में प्रकारों का योगदान दे सकते हैं। एक सरल तरीका एक्सटेंशन के साथ अन्य फ़ाइलों को देखने के लिए है। उसी निर्देशिका में डीएलएल।

तो फिर तुम एक्सएमएल है कि आप बस Type नाम से Dictionary में ऊपर देखो और Type.GetConstructor और ConstructorInfo.Invoke कहते हैं, इसी Type का एक उदाहरण बनाने के लिए उपयोग करना चाहते हैं से स्ट्रिंग है जब भी।

इसका लाभ यह है कि एक्सएमएल में पहचानकर्ता आपके कोड के भौतिक लेआउट से अलग होता है - आप असेंबली में चारों ओर प्रकारों को स्थानांतरित कर सकते हैं या पुरानी एक्सएमएल फाइलों को अमान्य किए बिना उनका नाम बदल सकते हैं।

+0

+1 ओपी को फिर से पढ़ने के बाद मुझे विश्वास है कि यह वास्तव में बेहतर समाधान है। –

7

Activator.CreateInstance आपको कक्षा के नाम को स्ट्रिंग के रूप में पास करने देता है और यह आपको उस कक्षा का एक नया उदाहरण देगा।

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