2012-10-17 15 views
5

को देखते हुए है कि मैं एक प्रकार "Wibble.Wobble" है कि एक विधानसभा "Foo.Bar"मौजूदा वर्ग/विधि

और कि विधानसभा में लोड नहीं है में मौजूद है मुख्य आवेदन लोड संदर्भ

वहाँ इसके बाद के भागों में निम्न स्ट्रिंग पार्स करने के लिए किसी मौजूदा सार्वजनिक तंत्र है:

"Wibble.Wobble, Foo.Bar, Version=1.0.0.0, Culture=neutral, PublicKeyToken=xyz" 

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

मुझे पता है कि वर्तमान लोड संदर्भ Type.GetType("typename") से प्रकार कैसे लोड करें, मुझे पता है कि एक असेंबली कैसे लोड करें और Assembly.LoadFile("xyz").GetType("abc") से एक प्रकार प्राप्त करें। मुझे इसमें क्या समस्याएं आ रही हैं कि यदि आप एक असेंबली से किसी प्रकार को लोड करने का प्रयास करते हैं तो यह का पूर्णतः योग्य नाम नहीं होना चाहिए, जहां आप Type.GetType का उपयोग करते समय कर सकते हैं।

समाधान स्वयं जटिल नहीं होना चाहिए, यह केवल पहले अल्पविराम से पहले स्ट्रिंग को विभाजित कर रहा है। हालांकि मैं जानना चाहता था कि ऑब्जेक्ट प्रस्तुति के रूप में पूरी तरह से योग्य नाम प्राप्त करने का कोई तरीका था, इसलिए मुझे ऐसा करने की ज़रूरत नहीं थी और यह पूरी निर्देशिका के माध्यम से लूप होने के बिना सही असेंबली का पता लगाने में मदद करेगा।

उत्तर

1

मेरे सभी खुदाई के बाद मुझे विश्वास नहीं है कि फ्रेमवर्क में सार्वजनिक रूप से कुछ भी उपलब्ध है जो ऐसा कर सकता है। मैं किसी के लिए मुझे अलग दिखाने के लिए प्यार करता हूं क्योंकि मैं कोर कार्यक्षमता का उपयोग करना पसंद करता हूं (या होना चाहिए) बेहतर परीक्षण और किसी ऐसे व्यक्ति द्वारा लिखा गया है जिसकी तुलना में ढांचे की बेहतर समझ है।

इस तरह मैंने अपने दृढ़ता से टाइप किए गए TypeName ऑब्जेक्ट को घुमाया है।

class TypeName 
{ 
    public TypeName(string name) 
    { 
     var index = name.LastIndexOf(','); 
     if (index > 0) 
     { 
      Name = name.Substring(0, index).Trim(); 

      AssemblyName = new AssemblyName(name.Substring(index + 1).Trim()); 
     } 
     else 
     { 
      Name = name;  
     } 
    } 

    public string Name { get; private set; } 

    public AssemblyName AssemblyName { get; private set; } 
} 

वस्तु एक string में ले जाता है जो या तो एक प्रकार का नाम या एक पूरी तरह से योग्य प्रकार का नाम होना चाहिए। यदि यह पूरी तरह से योग्य प्रकार का नाम है तो असेंबलीनाम विशेषता को असेंबलीनाम क्लास का उपयोग करके सेट किया गया है, अन्यथा इसे शून्य के रूप में छोड़ा गया है।

+1

इंडेक्स आपको एक अल्पविराम की पहली घटना देता है, जिसे सामान्य तर्कों में विभाजक के रूप में उपयोग किया जा सकता है। यह सुंदर नहीं होगा –

+0

@ डेविड स्चिमिट फेयर प्वाइंट, मुझे अभी तक उस परिदृश्य से निपटना नहीं है, लेकिन मैंने इंडेक्सऑफ के बजाय LastIndexOf का उपयोग करने के लिए उदाहरण अपडेट किया है। पारितोषिक के लिए धन्यवाद। – Bronumski

+1

LastIndexOf के साथ, यह कभी भी काम नहीं कर सकता है, सिस्टम पर विचार करें। स्ट्रिंग, mscorlib, संस्करण = 4.0.0.0, संस्कृति = तटस्थ, PublicKeyToken = b77a5c561934e089 अंतिम सूचकांक केवल सार्वजनिक KeyToken भाग प्राप्त होगा – Alex

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