获得ITypeSymbol的空白

时间:2015-05-16 18:37:55

标签: c# roslyn

我正在编写一些测试,我需要获得一个ITypeSymbol。以下是我的表现:

    private async Task<ITypeSymbol> GetTypeSymbol(string file, TextSpan span)
    {
        var code = File.ReadAllText(file);
        var tree = CSharpSyntaxTree.ParseText(code);

        var compilation = CSharpCompilation.Create(
            this.GetType().Assembly.GetName().Name,
            syntaxTrees: new[] { tree },
            references: new[]
            {
                MetadataReference.CreateFromAssembly(typeof(object).Assembly))
            });

        var model = compilation.GetSemanticModel(tree);
        var root = await tree.GetRootAsync().ConfigureAwait(false);
        return model.GetTypeInfo(root.FindNode(span)).Type;
    }

由于某种原因,即使我从一个看起来像这样的文件中传入代码,最后一行的Type属性也总是为null:

public class AClass { }

要清楚,文件读取正确,解析正确,编译已创建,我可以获取模型,FindNode()将找到我正在寻找的正确的ClassDeclarationSyntax节点。 GetTypeInfo()返回一个值,但Type和ConvertedType都为null。我有点期待这应该有一个价值。我的期望是否正确?如果是这样,我做错了什么,使Type属性为null?

1 个答案:

答案 0 :(得分:3)

实际上,似乎GetDeclaredSymbol()(How to get module ancestor in roslyn semanticmodel?)是可行的方法。这很好用。