2009-08-11 7 views
50

का उपयोग कर आंतरिक वर्ग का उपयोग कैसे करें मैं एक असेंबली के आंतरिक वर्ग तक कैसे पहुंच सकता हूं? कहें कि मैं System.ComponentModel.Design.DesignerHost तक पहुंच बनाना चाहता हूं। यहां डिज़ाइनरहोस्ट एक आंतरिक और मुहरबंद कक्षा है।प्रतिबिंब

असेंबली और प्रकार को लोड करने के लिए मैं कोड कैसे लिख सकता हूं? इसका मतलब है कि आप विधानसभा के बाहर से इसका इस्तेमाल करने के लिए नहीं कर रहे हैं तो एक प्रकार आंतरिक चिह्नित किया गया है, -

उत्तर

78

सामान्य तौर पर, आप ऐसा नहीं चाहिए। बाद में संस्करण में इसे हटाया जा सकता है, बदला जा सकता है। बस भार के जो एक BindingFlags तर्क लेते हैं, और झंडे कि आप पारित में BindingFlags.NonPublic शामिल देखने के लिए -

हालांकि, प्रतिबिंब आप प्रकार और सदस्यों, जो सार्वजनिक नहीं कर रहे हैं का उपयोग करने की अनुमति देता है।

यदि आपके पास प्रकार का नाम (असेंबली जानकारी सहित) का नाम है तो बस Type.GetType(string) पर कॉल करना चाहिए। यदि आप पहले से असेंबली को जानते हैं, और उस असेंबली के भीतर सार्वजनिक प्रकार के बारे में जानते हैं, तो असेंबली संदर्भ प्राप्त करने के लिए typeof(TheOtherType).Assembly का उपयोग करना आम तौर पर सरल होता है, तो आप Assembly.GetType(string) पर कॉल कर सकते हैं।

+8

@dattebayo: बस जॉन की जवाब पूरा करने के लिए, ध्यान दें कि आपके कोड पूर्ण विश्वास में चलाने के लिए की जरूरत है, या गैर सरकारी सदस्यों पर प्रतिबिंब होगा असफल –

+1

कभी-कभी आपको इसे तब तक करना पड़ता है जब तक कि यह टूट न जाए। मेरे पास एक WPF 'DataGrid' कमांड है जिसका पैरामीटर 'SelectedItems' है। कमांड में, पैरामीटर को 'ऑब्जेक्ट' के रूप में प्राप्त किया जाता है लेकिन यह 'SelectedCellCollection' टाइप करें, जो मेरे कोड में पहुंच योग्य नहीं है। मुझे 'ऑब्जेक्ट' पैरामीटर को 'चयनित कैलकुलेक्शन' में कास्ट करने की उम्मीद में इस प्रकार की धोखाधड़ी की आवश्यकता है। – ProfK

9

विधानसभा लोड करने के लिए और आप अपने उदाहरण में उद्धृत प्रकार:

Assembly design = Assembly.LoadFile(@"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Design.dll"); 
Type designHost = design.GetType("System.ComponentModel.Design.DesignerHost"); 
+9

आप केवल 'असेंबली.लोड ("सिस्टम। डिज़ाइन, संस्करण = 4.0.0.0, संस्कृति = तटस्थ, पब्लिककेट टोकन = b77a5c561934e089") ' – abatishchev

+3

यदि आपको केवल एक प्रकार की आवश्यकता है तो आप असेंबली को स्पष्ट रूप से लोड कर सकते हैं:' var designHost = type .GetType ("System.ComponentModel.Design.DesignerHost, System.Design, संस्करण = 4.0.0.0, संस्कृति = तटस्थ, PublicKeyToken = b77a5c561934e089"); ' –