繁体   English   中英

使用 Roslyn 获取“var”类型?

[英]Get Type of 'var' with Roslyn?

我有一个名为“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 或解决方案或工作区,但我似乎无法找出如何使用 Roslyn 加载我的测试解决方案,然后获得“x”的类型。

此外,我还没有找到任何真正好的 Roslyn 文档,它们似乎都分布在一堆不同的版本中,对于像我这样的初学者来说什么都没有。 有谁知道我可以阅读的“罗斯林简介”或类似的快速入门?

要获取使用var声明的变量的实际类型,请在SemanticModel上调用GetSymbolInfo() 您可以使用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..
    }
}

请参阅Roslyn源代码树中名为TestGetDeclaredSymbolFromLocalDeclarator的单元测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM