获取 ITypeSymbol 时返回 Null

4
我正在编写一些测试,我需要获取一个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属性始终为空。

public class AClass { }

明确一点,文件读取正常,解析正确,编译已创建,我可以获得模型,并且FindNode()将找到我要找的正确的ClassDeclarationSyntax节点。 GetTypeInfo()返回一个值,但是Type和ConvertedType都为null。我有点期望它实际上应该有一个值。如果是这样的话,我的期望是正确的吗?如果是,那么我错在了什么地方,导致Type属性为空?


澄清一下,我真正想做的是找出类型是否继承自某个类型,无论是接口还是类。如果我能使用反射,我可以使用.IsAssignableFrom()方法并完成任务,但我不能这样做。因此,我打算在ITypeSymbol上使用BaseType和Interfaces进行递归下降,但如果我甚至无法从GetTypeInfo()获取Type,那么我的想法就无法实现了。 - JasonBock
1个回答

3

1
Roslyn通常区分符号的声明引用GetDeclaredSymbol用于前者,而GetSymbolInfo/GetTypeInfo用于后者。 - Kevin Pilch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接