C# 获取类型为';var';和罗斯林?
我有一个名为“test.cs”的.cs文件,它基本上看起来像: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
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。您创建一个编译,然后从中获取语义模型。这更有意义,我将对编译进行一些研究,看看是否能够解决它。谢谢