2016-09-12 4 views
5

से संबंधित डायरेक्टिव सिंटैक्स का उपयोग करें नीचे दिए गए कोड में, "कंसोल। राइटलाइन" कॉल को काम करने के निर्देश का उपयोग करके "सिस्टम" की आवश्यकता होती है। मेरे पास पहले से ही "कंसोल। राइटलाइन" के लिए "सिस्टम का उपयोग" और एक InvocationExpressionSyntax ऑब्जेक्ट के लिए एक UseDirectiveSyntax ऑब्जेक्ट है। लेकिन Roslyn का उपयोग करके, मैं कैसे जान सकता हूं कि InvocationExpressionSyntax और UseDirectiveSyntax ऑब्जेक्ट्स एक-दूसरे से संबंधित हैं?InvirectExpressionSyntax

using System;  
public class Program 
{ 
    public static void Main() 
    { 
     Console.WriteLine("Hello World"); 
    } 
} 
+1

मुझे नहीं लगता कि आप वाक्य रचना पेड़ में कुछ भी पाते हैं करते हैं - इससे पहले कि यह तय किया जाए कि कौन सी विशिष्ट श्रेणी 'कंसोल' का संदर्भ है, आपको पहले सेमेन्टिक्स की आवश्यकता होगी। –

+0

हां वास्तव में, लेकिन जब भी मेरे पास दोनों का प्रतीक वस्तु है, तो मैं उन्हें कैसे जोड़ सकता हूं? – TWT

उत्तर

4

InvocationExpressionSyntax की विधि प्रतीक है कि एक नाम स्थान प्रतीक है कि आप निर्देशों का उपयोग का प्रतीक पुन: प्राप्त करने से मिलता है के बराबर होना चाहिए एक सदस्य ContainingNamespace है। अर्थ Name सदस्य को अर्थपूर्ण मॉडल पूछताछ के लिए शुरुआती बिंदु के रूप में उपयोग करना है, क्योंकि पूरे UsingDirectiveSyntax आपको एक प्रतीक नहीं देंगे।

Try this LINQPad query (या एक सांत्वना परियोजना में कॉपी), और आप क्वेरी की अंतिम पंक्ति पर true मिलेगा;)

// create tree, and semantic model 
var tree = CSharpSyntaxTree.ParseText(@" 
    using System; 
    public class Program 
    { 
     public static void Main() 
     { 
      Console.WriteLine(""Hello World""); 
     } 
    }"); 
var root = tree.GetRoot(); 

var mscorlib = MetadataReference.CreateFromFile(typeof(object).Assembly.Location); 
var compilation = CSharpCompilation.Create("SO-39451235", syntaxTrees: new[] { tree }, references: new[] { mscorlib }); 
var model = compilation.GetSemanticModel(tree); 

// get the nodes refered to in the SO question 

var usingSystemDirectiveNode = root.DescendantNodes().OfType<UsingDirectiveSyntax>().Single(); 
var consoleWriteLineInvocationNode = root.DescendantNodes().OfType<InvocationExpressionSyntax>().Single(); 

// retrieve symbols related to the syntax nodes 

var writeLineMethodSymbol = (IMethodSymbol)model.GetSymbolInfo(consoleWriteLineInvocationNode).Symbol; 
var namespaceOfWriteLineMethodSymbol = (INamespaceSymbol)writeLineMethodSymbol.ContainingNamespace; 

var usingSystemNamespaceSymbol = model.GetSymbolInfo(usingSystemDirectiveNode.Name).Symbol; 

// check the namespace symbols for equality, this will return true 

namespaceOfWriteLineMethodSymbol.Equals(usingSystemNamespaceSymbol).Dump();