2015-04-06 8 views
5

के साथ एक घोषणा के सिंस्क्सैक्स का नामस्थान कैसे प्राप्त करें मेरे पास एक सी # समाधान है जिसमें कुछ क्लास फ़ाइलें हैं। Roslyn के साथ मैं समाधान के भीतर परियोजनाओं की एक सूची प्राप्त करने के लिए एक समाधान का विश्लेषण करने में सक्षम हूँ। वहां से, मैं प्रत्येक परियोजना में दस्तावेज प्राप्त कर सकता हूं। फिर, मैं प्रत्येक क्लासडेक्लेरेशन सिंटैक्स की एक सूची प्राप्त कर सकता हूं। यह शुरुआती बिंदु है।रोज़लिन: Roslyn C#

 foreach (var v in _solution.Projects) 
     { 
      //Console.WriteLine(v.Name.ToString()); 
      foreach (var document in v.Documents) 
      { 
       SemanticModel model = document.GetSemanticModelAsync().Result; 
       var classes = document.GetSyntaxRootAsync().Result.DescendantNodes().OfType<ClassDeclarationSyntax>(); 
       foreach(var cl in classes) 
       { 
// Starting around this point... 
        ClassDiagramClass cls = new ClassDiagramClass(cl, model); 
        diagramClasses.Add(cls); 
       } 
      } 
     } 
इन वस्तुओं मैं प्रत्येक वर्ग के भीतर इस्तेमाल चर के नाम स्थान प्राप्त करने में सक्षम होना चाहता हूँ से

। फ़ाइल 1 में एक विधि "getBar()" है जो बी.बार के प्रकार का ऑब्जेक्ट देता है। नामस्थान महत्वपूर्ण है क्योंकि यह आपको बताता है कि किस प्रकार का बार वास्तव में वापस किया जा रहा है।

File1.cs

using B; 
namespace A { 
    public class foo(){ 
     public Bar getBar(){ return new Bar();} 
    } 
} 

File2.cs

namespace B { 
    public class Bar(){ 
    } 
} 

File3.cs

namespace C { 
    public class Bar(){ 
    } 
} 

मुद्दा है कि मुझे यकीन है कि ज नहीं कर रहा हूँ नामस्थान मूल्य पर जाने के लिए ओउ, जहां से मैं अभी कोड में हूं। कोई विचार?

+0

आप 'होना चाहिए उन कॉल await'ing। – SLaks

+0

नेस्टेड प्रकारों से सावधान रहें। – SLaks

उत्तर

5

नाम स्थान अर्थ जानकारी है, तो आप अर्थ मॉडल से इसे पाने के लिए की जरूरत है:

model.GetTypeInfo(cl).Type.ContainingNamespace 
+0

क्या आपने अभी उल्लेख किया है कि टाइपइन्फो और कंटेनिंग नेमस्पेस (शायद मुझे एक एक्सटेंशन गुम है?) के बीच एक लापता कदम प्रतीत होता है, लेकिन वर्तमान में मैं वर्तमान क्लास के लिए नेमस्पेस प्राप्त करने के लिए इस कोड का उपयोग कर रहा हूं। समस्या यह है कि यह केवल उस दस्तावेज़ के भीतर परिभाषित ऑब्जेक्ट/कक्षाओं के लिए काम करता है, जिससे सेमेन्टिक मॉडेल का व्युत्पन्न किया गया था। जब आप उस ऑब्जेक्ट के लिए नेमस्पेस प्राप्त करना चाहते हैं जिसे वर्तमान दस्तावेज़ आवृत्ति के भीतर परिभाषित नहीं किया गया है, तो यह थोड़ा सा ट्रिकियर हो जाता है। – Pangamma

+0

रुको, @ स्लक्स। मेरे पास यह सिद्धांत है कि इसे कैसे हल किया जाए। यह थोड़ा हैकी है, लेकिन यह काम करना चाहिए। यदि टाइप नामकरण स्ट्रिंग के भीतर नेमस्पेस शामिल है, तो मान लें कि नामस्थान 100% सटीक है। यदि टाइप स्ट्रिंग में कोई अवधि नहीं है, तो मान लें कि इसे किसी नामस्थान से मिलान करने की आवश्यकता है। दस्तावेज़ के शीर्ष पर "उपयोग" घोषणाओं में से प्रत्येक के माध्यम से Iterate और प्रत्येक <"उपयोग" + typeNameString> लोड करने का प्रयास करें। यदि इनमें से कोई भी विकल्प लोड किया जा सकता है, तो आप मान सकते हैं कि आपको एक मैच मिला है। अगर यह काम करता है तो मैं थोड़ा सा कोड पोस्ट करूंगा। – Pangamma

+0

@ टेलर: ओह; यह 'टाइप' होना चाहिए। – SLaks