Csharp/C#教程:用Roslyn获取’var’的类型?分享


用Roslyn获取’var’的类型?

我有一个名为’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文档,它似乎都散布在一堆不同的版本中,对于像我这样的初学者来说没什么。 有没有人知道我可以阅读的“罗斯林简介”或类似的快速入门?

要获取使用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(); foreach (var variableDeclaration in variableDeclarations) { var symbolInfo = semanticModel.GetSymbolInfo(variableDeclaration.Declaration.Type); var typeSymbol = symbolInfo.Symbol; // the type symbol for the variable.. } } 

请参阅Roslyn源代码树中名为TestGetDeclaredSymbolFromLocalDeclarator的unit testing。

上述就是C#学习教程:用Roslyn获取’var’的类型?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/955182.html

(0)
上一篇 2021年11月21日
下一篇 2021年11月21日

精彩推荐