2015-11-03 4 views
8

कुछ मामलों में, जब मैं अपने सिंटैक्स नोड के लिए आईसिम्बोल प्राप्त करने का प्रयास कर रहा हूं, तो मैं SemanticModel.GetSymbolInfo का उपयोग करते समय असफल हो रहा हूं (लेकिन शून्य हो रहा हूं लेकिन उपयोग करते समय सफल होता हूं SemanticModel.GetDeclaredSymbol।SemanticModel.GetSymbolInfo का उपयोग कब करें और जब SemanticModel.GetDeclaredSymbol

मैंने एक उदाहरण संलग्न किया है।

तो मेरा सवाल यह है कि अर्थपूर्ण मॉडल प्राप्त करने के तरीकों में से प्रत्येक का उपयोग कब किया जाए?

public class Class1 
{ 
    public System.String MyString { get; set; } 

    public static void Main() 
    { 
     var str = 
      @" 
      namespace ClassLibrary31 
      { 
       public class Class1 
       { 
        public System.String MyString { get; set; } 
       } 
      }"; 

     var syntaxTree = SyntaxFactory.ParseSyntaxTree(str); 

     MetadataReference[] metadataReferenceReferences = new MetadataReference[] 
     { 
      MetadataReference.CreateFromFile(typeof(object).Assembly.Location), 
     }; 

     var compilation = 
      CSharpCompilation 
       .Create("TraceFluent", 
        new[] {syntaxTree}, 
        options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary, warningLevel:1), 
        references: metadataReferenceReferences 
       ); 

     var temp = compilation.Emit("temp"); 
     var semanticModel = compilation.GetSemanticModel(syntaxTree, true); 

     PropertyDeclarationSyntax propertySyntaxNode = 
      syntaxTree.GetRoot() 
       .DescendantNodes() 
       .OfType<PropertyDeclarationSyntax>() 
       .First(); 



     //var qu = propertySyntaxNode.q 

     //var symbolInfo = semanticModel.GetDeclaredSymbol(propertySyntaxNode); 
     var symbol = semanticModel.GetDeclaredSymbol(propertySyntaxNode) as IPropertySymbol; 
     var typeInfo = semanticModel.GetTypeInfo(propertySyntaxNode).Type; 
    } 
} 

उत्तर

5

मेरा मानना ​​है कि आप किसी दिए गए वाक्य रचना नोड के लिए प्रतीक हो रही मतलब, और पेड़ के लिए अर्थ मॉडल नहीं मिल रहा है।

आम तौर पर, जब आप एक घोषणा (कक्षा, संपत्ति, विधि, ...) के अंतर्निहित प्रतीक प्राप्त करना चाहते हैं, तो आपको GetDeclaredSymbol का उपयोग करना चाहिए। आंतरिक रूप से, GetSymbolInfothis विधि कॉल करता है। आप वहां संभाले गए विभिन्न मामलों को देख सकते हैं। घोषणाओं को संभाला नहीं जाता है, इसलिए उन लोगों के लिए आपको GetDeclaredSymbol का उपयोग करना होगा, जिनके आंतरिक आप here पा सकते हैं।

+0

बस विस्तार करने के लिए: नियम मुझे उपयोगी पाया गया है: "अगर सिंटैक्स के एक टुकड़े में 'घोषणा घोषणा' है, तो 'GetDeclaredSymbol()' का उपयोग करें। अन्यथा 'GetSymbolInfo()' "का उपयोग करें। (यह 100% सटीक नहीं है, लेकिन यह बहुत करीब है) – JoshVarty

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