在解决方案中检索Roslyn的所有类型

有谁知道如何在解决方案中检索所有可用类型(语义)? 从几个项目中创建汇编很容易。

MSBuildWorkspace workspace = MSBuildWorkspace.Create(); var solution = await workspace.OpenSolutionAsync(solutionPath, cancellationToken); var compilations = await Task.WhenAll(solution.Projects.Select(x => x.GetCompilationAsync(cancellationToken))); 

迭代所有ClassDeclarations对我来说是不够的,因为我想要所有类型和它们之间的连接。

 foreach (var tree in compilation.SyntaxTrees) { var source = tree.GetRoot(cancellationToken).DescendantNodes(); var classDeclarations = source.OfType(); } 

对于给定的编译,您可以通过Compilation.GlobalNamespace通过递归迭代所有GetTypeMembers()GetNamespaceMembers()来访问所有可用类型。 这并没有给出解决方案中的所有类型,而是从当前编译(项目)到其所有引用可用的所有类型。

 List ls = new List(); foreach (Document d in p.Documents) { SemanticModel m = d.GetSemanticModelAsync().Result; List lc = d.GetSyntaxRootAsync().Result.DescendantNodes().OfType().ToList(); foreach ( var c in lc ) { ISymbol s = m.GetDeclaredSymbol(c); ls.Add(s); } }