16

在某些情况下,当我尝试为我的语法节点获取 ISymbol 时,我在使用 SemanticModel.GetSymbolInfo 时失败(获取 null),但在使用 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;
    }
}
4

1 回答 1

10

我相信您的意思是获取给定语法节点的符号,而不是获取树的语义模型。

通常,当您想要获取声明的基础符号(类、属性、方法...)时,您应该使用GetDeclaredSymbol. 在内部,GetSymbolInfo调用方法。您可以看到那里处理的不同案例。不处理声明,因此对于您需要使用的那些GetDeclaredSymbol,您可以在此处找到其内部结构。

于 2015-11-03T07:38:22.127 回答