我有一个名为'test.cs'的.cs文件,它基本上就像:
namespace test
{
public class TestClass
{
public void Hello()
{
var x = 1;
}
}
}
我正在尝试用Roslyn解析它并得到x的类型,它应该是'int',但我只能发现它是'var'类型,我似乎无法获得实际的底层类型
这基本上就是我现在的代码
var location = "test.cs";
var sourceTree = CSharpSyntaxTree.ParseFile(location);
var root = (CompilationUnitSyntax)sourceTree.GetRoot();
foreach (var member in root.Members)
{
//...get to a method
var method = (MethodDeclarationSyntax())member;
foreach (var child in method.Body.ChildNodes())
{
if (child is LocalDeclarationStatementSyntax)
{
//var x = 1;
child.Type.RealType()?
}
}
}
我怎样才能得到真正的孩子?我已经看到一些事情说我应该使用SemanticModel或Solution或Workspace,但我似乎无法找到如何使用Roslyn加载我的测试解决方案然后得到'x'的类型。
另外,我还没有找到任何真正优秀的Roslyn文档,它似乎都散布在一堆不同的版本中,对于像我这样的初学者来说并不算什么。有没有人知道我可以阅读的“罗斯林简介”或类似的快速入门?
答案 0 :(得分:21)
要获取使用var
声明的变量的实际类型,请在GetSymbolInfo()
上调用SemanticModel
。您可以使用MSBuildWorkspace
打开现有解决方案,然后枚举其项目及其文档。使用文档获取其SyntaxRoot
和SemanticModel
,然后查找VariableDeclarations
并检索声明变量Type
的符号,如下所示:
var workspace = MSBuildWorkspace.Create();
var solution = workspace.OpenSolutionAsync("c:\\path\\to\\solution.sln").Result;
foreach (var document in solution.Projects.SelectMany(project => project.Documents))
{
var rootNode = document.GetSyntaxRootAsync().Result;
var semanticModel = document.GetSemanticModelAsync().Result;
var variableDeclarations = rootNode
.DescendantNodes()
.OfType<LocalDeclarationStatementSyntax>();
foreach (var variableDeclaration in variableDeclarations)
{
var symbolInfo = semanticModel.GetSymbolInfo(variableDeclaration.Declaration.Type);
var typeSymbol = symbolInfo.Symbol; // the type symbol for the variable..
}
}
答案 1 :(得分:3)
请参阅Roslyn源代码树中名为TestGetDeclaredSymbolFromLocalDeclarator的单元测试。