Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取类型为';var';和罗斯林?_C#_.net_Roslyn - Fatal编程技术网

C# 获取类型为';var';和罗斯林?

C# 获取类型为';var';和罗斯林?,c#,.net,roslyn,C#,.net,Roslyn,我有一个名为“test.cs”的.cs文件,它基本上看起来像: namespace test { public class TestClass { public void Hello() { var x = 1; } } } 我试图用Roslyn解析它,得到x的类型,应该是'int',但我只能发现它是'var'类型,我似乎无法得到实际的底层类型 下面是我现在的代码 var location = "t

我有一个名为“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()?
        }
    }
}
我怎样才能得到真正的孩子?我看到一些东西说我应该使用语义模型、解决方案或工作区,但我似乎不知道如何用Roslyn加载我的测试解决方案,然后得到“x”类型


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

要获取使用
var
声明的变量的实际类型,请调用
SemanticModel
上的
GetSymbolInfo()
。您可以使用
MSBuildWorkspace
打开现有解决方案,然后枚举其项目及其文档。使用文档获取其
SyntaxRoot
语义模型
,然后查找
变量声明
,并检索声明变量的
类型
的符号,如下所示:

var-workspace=MSBuildWorkspace.Create();
var solution=workspace.OpenSolutionAsync(“c:\\path\\to\\solution.sln”).Result;
foreach(solution.Projects.SelectMany(project=>project.Documents)中的var文档)
{
var rootNode=document.GetSyntaxRootAsync().Result;
var semanticModel=document.GetSemanticModelAsync().Result;
var variableDeclarations=rootNode
.DegeneratNodes()的
.of type();
foreach(variableDeclarations中的变量variableDeclaration)
{
var symbolInfo=semanticModel.GetSymbolInfo(variableDeclaration.Declaration.Type);
var typeSymbol=symbolInfo.Symbol;//变量的类型符号。。
}
}

请参阅Roslyn源代码树中调用的单元测试。

我相信您需要
语义模型来实现这一点。
semanticModel.GetTypeInfo(child.Type).Type告诉您什么?^这是我的问题的一部分,我似乎不知道如何为我的C文件创建semanticModel。您不创建semanticModel。您创建一个编译,然后从中获取语义模型。这更有意义,我将对编译进行一些研究,看看是否能够解决它。谢谢