एक सीएस फ़ाइल से एक विधि की सामग्री प्राप्त करें

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

मैंने रेगेक्स और प्रतिबिंब की कोई सफलता नहीं की है, क्या कोई मदद कर सकता है?

धन्यवाद

0

6 उत्तर

NRefactory is the tool for this job. Take a look here: http://laputa.sharpdevelop.net/content/binary/NRefactory.wmv

0
जोड़ा

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

एक पार्सर चीजों को बहुत आसान बनाना चाहिए। एक अच्छे जनरेटर के लिए antlr देखें।

प्रतिबिंब के रूप में, मेरा मानना ​​है कि आप कोड को संकलित करने का प्रयास कर सकते हैं (जब तक आपके पास सभी आवश्यक निर्भरताएं हों) और उसके बाद सामग्री को प्रतिबिंबित करें। लेकिन मैं पार्सर के साथ जाऊंगा।

0
जोड़ा

आम तौर पर जिस समस्या को आप हल करने का प्रयास कर रहे हैं वह सी # कोड को उसी तरीके से पार्स करना है जिस पर संकलक होगा, और फिर कोड उत्पन्न करने के बजाय कार्यों की सामग्री को सहेज लेगा। तो आपके समाधान के लिए पृष्ठभूमि के रूप में आपको सी # व्याकरण और उन्हें पार्स करने के तरीके को देखना चाहिए।

स्टिंगजैक के अनुसार, ऐसा करने के लिए एक सरल विधि एक रेगेक्स बनाना होगा जो केवल फ़ंक्शन परिभाषाओं की पहचान करेगी। फिर आप मान सकते हैं कि बीच में सबकुछ एक फंक्शन बॉडी है। हालांकि यह धारणा एक वर्ग के अंत में एक फ़ाइल में या यहां तक ​​कि पिछली} जैसी कई कक्षाओं जैसी चीजों को संभाल नहीं पाएगी। इस तरह की चीजों को संभालने के लिए आपको एक सी # कंपाइलर इंजीनियर करना होगा, क्योंकि पूर्ण सी # व्याकरण को संसाधित करना एकमात्र चीज है जो सही ढंग से पहचान करेगी कि सी # क्या एक कार्य है।

0
जोड़ा

फ़ंक्शन हेडर ढूंढने के बाद, जब तक आप फ़ंक्शन का अंत नहीं पाते हैं तब तक ब्रेसिज़ की संख्या गिनें।

0
जोड़ा
ट्रेब्स को सबसे अच्छा विचार मिला।
जोड़ा लेखक StingyJack, स्रोत
ठीक है जब तक टिप्पणियों या तारों में कोई असंतुलित {} s नहीं है ... और किसी विधि की शुरुआत की पहचान करने में सक्षम होने पर निर्भर करता है।
जोड़ा लेखक Blair Conrad, स्रोत

Assuming that the file is valid (i.e. compiles), you can start by reading the whole file into a string.

मैं आपके प्रश्न से इकट्ठा हूं कि आप केवल कक्षा के नामों में नहीं, विधि नामों में रुचि रखते हैं। फिर आपको एक रेगेक्स की आवश्यकता है जो आपको public | संरक्षित | निजी , वैकल्पिक कीवर्ड वर्चुअल/ओवरराइड इत्यादि के सभी उदाहरण देता है, MethodName , (, वैकल्पिक पैरामीटर, ) । अगर कोडिंग सम्मेलन होते हैं तो इससे मदद मिलेगी, इसलिए आप मान लें कि सभी विधि परिभाषाएं हमेशा एक पंक्ति में थीं, कई पंक्तियों में फैली नहीं थीं।

एक बार आपके पास यह हो जाने के बाद, यह फ़ंक्शन बॉडी प्राप्त करने के लिए {और} गिनने का मामला है।

और एक अंतिम सलाह: मान्यताओं से सावधान रहें । उनके पास बट में आपको काटने का बुरा खरगोश है।

EDIT: Ouch, forgot about comments! if you have brackets in comments in the method body, your counting can go wrong. So you need to strip all comments from the source as your very first step.

0
जोड़ा

I don't know if it's any use to you but Visual Studio Addins include a EnvDTE object, that gives you full access to the VB and C# language parsers. See Discovering Code with the code Model

मैंने इसे साल पहले स्पर्श किया था, मुझे नहीं पता कि इसका उपयोग करना कितना मुश्किल है, या यह कितना प्रभावी है, लेकिन ऐसा लगता है कि यह आपको जो चाहिए वह आपको देगा।

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

यदि आप आलेख को पूर्ण रूप से पढ़ते हैं तो यह बताता है कि फ़ंक्शन के लिए फ़ाइल से पूर्ण पाठ को कैसे खींचें

उम्मीद है की यह मदद करेगा :)

0
जोड़ा