2011-10-10 7 views
7

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

यदि आपके पास कुछ सार्वजनिक और निजी (या आंतरिक) प्रकारों के साथ एक असेंबली है, तो केवल सार्वजनिक प्रकार बाहर से उपलब्ध होना चाहिए। किसी भी प्रकार जो आंतरिक, या निजी हैं - उपलब्ध नहीं होना चाहिए, वास्तव में, उनके अस्तित्व को खोजने योग्य नहीं होना चाहिए।

इसलिए, GetTypes और GetExportedTypes - मेरे दिमाग में, वही चीज़ वापस करनी चाहिए।

स्पष्ट रूप से मैं इस गलत के बारे में सोच रहा हूं - प्रत्येक के लिए क्या है?

धन्यवाद!

+1

प्रतिबिंब गैर-सुलभ प्रकारों तक पहुंच प्रदान करता है। –

+0

यह अभी तक हल नहीं हुआ है! लेकिन मैंने निकटतम को स्वीकार किया। – Coopernick

उत्तर

4

भाषा स्तर पर दृश्यता के प्रतिबिंब स्तर पर प्रकार दृश्यता के साथ कुछ लेना देना नहीं है।

प्रतिबिंब का पूरा विचार यह है कि आप सभी प्रकार, सदस्यों आदि देख सकते हैं और उनका निरीक्षण कर सकते हैं; कोड जनरेशन उद्देश्यों या जो कुछ भी के लिए कहें। समान रूप से आपके पास परिदृश्य हैं जैसे InternalsVisibleToAttribute का उपयोग किया जाता है और, जैसा कि अन्य ने कहा है, जब आपको अपनी असेंबली को प्रतिबिंबित करने की आवश्यकता होती है। ये सभी पूरी तरह वैध हैं और उपलब्ध नहीं होने पर असंभव हो जाएंगे (जिससे नेट फ्रेमवर्क को सीमित कर दिया जाएगा)।

इसलिए डिफ़ॉल्ट सभी प्रकारों को वापस करने के लिए होना चाहिए - केवल जब रनटाइम पर किसी प्रकार का उपयोग करने का प्रयास किया जाता है तो दृश्यता इसमें आती है। यह साइड-स्टेप भी हो सकता है; नेट फ्रेमवर्क स्वयं कुछ परिदृश्यों पर निर्भर करता है जहां अन्य असेंबली के अपने निजी प्रकारों को तुरंत चालू करने में सक्षम होना; और आप अपनी गतिशील रूप से निर्मित असेंबली पर दृश्यता जांच भी छोड़ सकते हैं। मैं इस सुविधा का उपयोग अपने स्वयं के कस्टम-लुढ़का आईओसी और डी फ्रेमवर्क पर हमारे इन-हाउस अनुप्रयोगों के लिए लिखे गए हैं ताकि हमारे देवताओं को बाहरी कोड से पूरी तरह छुपाया जा सके, लेकिन अभी भी उनके अनुप्रयोगों के भीतर उपयोग योग्य हो।

0

बाहरी असेंबली के लिए जो वास्तव में मामला होगा, लेकिन यदि आप अपनी असेंबली पर गेट टाइप्स को कॉल करते हैं तो क्या होगा?

फिर आप निजी और आंतरिक भी देखेंगे, जो तार्किक है।

+1

यह सच नहीं है - कृपया एमएसडीएन दस्तावेज देखें ... – Yahia

6

MSDN docs से:

Assembly.GetTypes विधि
वापसी मूल्य प्रकार: System.Type []
एक सरणी कि सभी प्रकार है कि इस विधानसभा में परिभाषित कर रहे हैं शामिल हैं।

MSDN docs से:

Assembly.GetExportedTypes विधि
वापसी मूल्य
प्रकार: System.Type []
एक सरणी का प्रतिनिधित्व करता है कि प्रकार इस विधानसभा में परिभाषित है कि असेंबली के बाहर दिखाई दे रहे हैं।

तो GetTypes() कॉल वास्तव में आप सभी प्रकार एक सभा में परिभाषित दे देंगे - चाहे वे "दृश्यमान" और आप के लिए है या नहीं instantiable कर रहे हैं। शायद अजीब लग सकता है - लेकिन क्या होगा यदि आप खुद का निरीक्षण करना चाहते हैं, अपनी खुद की असेंबली (या एक ही नामस्थान में एक ही नाम आपके कोड के रूप में)? यदि आवश्यक हो तो आपको सब कुछ देखने में सक्षम होना चाहिए।

+0

ठीक है, धन्यवाद, लेकिन मुझे ग्राहक दिलचस्पी से, और यदि मैं एक असेंबली जारी करता हूं, तो मुझे अधिक दिलचस्पी है, केवल सार्वजनिक इंटरफ़ेस खोजने योग्य होना चाहिए । उस ने कहा, आप अपनी खुद की असेंबली का निरीक्षण करने के बारे में सही हैं। – Coopernick

0

GetExportedTypes() में संरक्षित/निजी प्रकार शामिल नहीं हैं। GetTypes() में सभी प्रकार शामिल हैं।

internal के बारे में GetExportedTypes() का एमएसडीएन दस्तावेज अस्पष्ट है।

0

यदि आप सभी सार्वजनिक प्रकार चाहते हैं, तो आप GetExportedTypes का उपयोग कर सकते हैं, लेकिन यदि आप अन्य सभी प्रकार भी चाहते हैं, तो आप GetTypes का उपयोग कर सकते हैं। यहां तक ​​कि यदि कोई प्रकार निजी या आंतरिक है तो आप नए उदाहरण बना सकते हैं और प्रतिबिंब और गतिशील के माध्यम से इसका उपयोग कर सकते हैं, इसलिए मुझे इनमें से कोई भी अनावश्यक नहीं दिख रहा है।

0

मैं एक वेब एपीआई bug की जांच कर रहा था जो इसमें भाग गया और Assembly.GetExportedTypes और 'असेंबली.गेट टाइप' के बीच एक बहुत ही महत्वपूर्ण अंतर पाया। यह प्रलेखन में है लेकिन यह बहुत स्पष्ट नहीं है।

Assembly.GetExportedTypes किसी भी निर्भर असेंबली को लोड नहीं किया जा सकता है, तो 'FileNotFoundException' फेंकता है। 'असेंबली। गेट टाइप throws प्रतिबिंब टाइप टाइपऑक्सप्शन which contains types that are loaded successfully. So, if you want to succeed even if some of the types in the assembly cannot be loaded, you should use गेट टाइप and not GetExportedTypes`।

कोड का यह टुकड़ा Assembly.GetExportedTypes के रूप में काम नहीं करेगा ReflectionTypeLoadException फेंक नहीं देता है।

 Type[] types; 
     try 
     { 
      types = assembly.GetExportedTypes(); 
     } 
     catch (ReflectionTypeLoadException e) 
     { 
      types = e.Types; 
     }