用Roslyn获取'var'的类型?

Mat*_*Sot 17 .net c# roslyn

我有一个名为'test.cs'的.cs文件,它基本上是这样的:

namespace test
{
    public class TestClass
    {
        public void Hello()
        {
            var x = 1;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我试图用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()?
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能得到真正的孩子?我已经看到一些事情说我应该使用SemanticModel或Solution或Workspace,但我似乎无法找到如何使用Roslyn加载我的测试解决方案然后获得'x'的类型.

此外,我还没有找到任何非常好的Roslyn文档,它似乎都散布在一堆不同的版本中,对于像我这样的初学者来说没什么.有没有人知道我可以阅读的"Roslyn简介"或类似的快速入门?

and*_*dyp 22

要获得使用声明的变量的实际类型var,叫GetSymbolInfo()SemanticModel.您可以使用打开现有解决方案MSBuildWorkspace,然后枚举其项目及其文档.使用文档来获取其SyntaxRootSemanticModel,然后查找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..
    }
}
Run Code Online (Sandbox Code Playgroud)