2010-07-23 17 views
13

लागू करना मैं richtextbox नियंत्रण के आधार पर सी # कोड संपादक में इंटेलिसेंस जोड़ने की कोशिश कर रहा हूं। अब तक, मुझे सभी चर और उनके प्रकारों को खोजने के लिए दर्ज टेक्स्ट को पार्स करना है (अच्छी तरह से काम करता है)। ड्रॉप डाउन बॉक्स अच्छी तरह से काम करता है। मुझे जो नहीं मिल सकता है वह ड्रॉप-डाउन सूची बॉक्स के विकल्पों की उचित सूची है।विजुअल स्टूडियो इंटेलिसेंस

मैं निम्न सूची कैसे प्राप्त कर सकते हैं, प्रोग्राम के रूप में:

alt text

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

मैंने इस कोड को आजमाया है: http://www.codeproject.com/KB/cs/diy-intellisense.aspx लेकिन इसे ठीक से काम करने के लिए नहीं मिला। मैंने स्टैक ओवरफ्लो पर अन्य धागे का एक टन भी नहीं लिया है, इसका कोई फायदा नहीं हुआ है। मैं वास्तव में किसी एल्स ड्रॉप-इन संपादक घटक का उपयोग करने के बजाय इसे खत्म करना चाहता हूं।

किसी भी संकेत की सराहना की जाएगी। धन्यवाद।

+0

ओह, मैं यह देखना चाहता हूं कि कोई व्यक्ति मौजूदा इंटेलिजेंस कार्यान्वयन में इसे कैसे कार्यान्वित करने के बजाय हुक करता है :) –

+0

ब्याज से, मुझे आश्चर्य है कि आप Type.GetMembers पर नहीं आए हैं स्वाभाविक रूप से निष्कर्ष। आप जानते हैं कि आपको किसी प्रकार के बारे में जानकारी चाहिए, तो टाइप क्लास में क्यों न देखें? –

+0

@ किरेन जॉनस्टोन: यह मेरी पहली कोशिश थी, हालांकि मुझे गलत परिणाम मिल रहे थे। सूची पॉप्युलेटिंग थी जैसे कि मैंने चर नाम के बजाय 'रंग' टाइप किया था। तो, मुझे लगता है कि मैं गलत ट्रैक पर था। – BoltBait

उत्तर

4

यदि आप इस प्रकार को जानते हैं, तो आपको इस प्रकार पर प्रतिबिंबित करने और आपको आवश्यक सारी जानकारी प्राप्त करने में सक्षम होना चाहिए।

Type.GetMembers शायद आपकी सबसे अच्छी शर्त होगी। साथ ही आप किसी भी स्थिर तरीकों पाने के लिए दूसरी कॉल आवश्यकता हो सकती है:

var instanceMembers = typeof(Color) 
         .GetMembers(BindingFlags.Instance | BindingFlags.Public); 

var staticMembers = typeof(Color) 
        .GetMembers(BindingFlags.Static | BindingFlags.Public); 

प्रत्येक MemberInfo वस्तु आप सदस्य प्रकार (संपत्ति, फील्ड, विधि, घटना, आदि)

बस का उपयोग बताने के लिए सक्षम हो जाएगा instanceMembers जब उपयोगकर्ता आपके चर में एक चर (जैसे c) टाइप करता है तो . और staticMembers का उपयोग करें जब उपयोगकर्ता एक प्रकार का नाम टाइप करें (जैसे Color आपके उदाहरण में) . के बाद।

+0

हां, Type.GetFields(), Type.GetConstructors(), और Type.GetEvents() अन्य कॉल की आवश्यकता होगी, मुझे विश्वास है। –

+1

@Nate Dudek - उन सभी को GetMembers पर कॉल करके संभाला जा सकता है। –

+0

उसे नहीं पता था। आप सीखते हैं कि हर दिन कुछ पता था! –

1

मान लिया जाये कि आप प्रकार के साथ एक नाम तालिका है यह आप अच्छी शुरुआत देना चाहिए:

var type = _names[name].Type; 
var members = type.GetMembers(); // Check context to grab private methods? 

तो हो सकता है आप आपके नाम तालिका का विस्तार कर सकते शामिल करने के लिए:

Type 
Context 
Members 
+0

मैं नाम संग्रहीत कर रहा हूं और तारों की एक जोड़ी के रूप में टाइप कर रहा हूं। – BoltBait

+1

@ बोल्टबेट - आप एक अच्छी संरचना बनाना चाहते हैं और इसके बजाय प्रकार को 'टाइप' उदाहरण के रूप में दबा सकते हैं। – ChaosPandion

+0

धन्यवाद। 'टाइप' को संग्रहीत करना इसे बहुत आसान बना देता है। – BoltBait

1

आप करना चाहते हैं कुछ डिग्री के प्रति प्रतिबिंब का उपयोग करें। यदि आपके पास प्रकार, या प्रकार का नाम है, तो आप Type उदाहरण प्राप्त कर सकते हैं।

उदा।

तो फिर तुम कि Type वस्तु पर Type.GetMembers() कॉल कर सकते हैं, यहाँ देखें:

http://msdn.microsoft.com/en-us/library/424c79hc.aspx

... और आप MemberInfo वस्तुओं जो नाम है की एक सरणी होगा (.Name), सदस्य का प्रकार (.MemberType), और उस अन्य जानकारी से, पैरामीटर सूचियों की तरह।

उम्मीद है कि मदद करता है।

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