我正在编写一些测试,我需要获得一个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?
答案 0 :(得分:3)
实际上,似乎GetDeclaredSymbol()(How to get module ancestor in roslyn semanticmodel?)是可行的方法。这很好用。