在 Roslyn 中获取类之间的依赖关系 [英] Get dependencies between classes in Roslyn
问题描述
我使用 Roslyn 成功获取了项目之间的依赖关系,现在我想获取类之间的依赖关系,类似于 Visual Studio Enterprise 中的代码映射功能.
I am successfully getting dependencies between projects with Roslyn, and now I would like to get dependencies between classes, similar to the Code Map feature in Visual Studio Enterprise.
这是我的代码,?????"部分是我想象我可以得到一些东西的地方.不过,我对 Roslyn API 很陌生,不知道如何从那里开始.
Here is my code, the "?????" part is where I imagine I could get something. I am very new to the Roslyn API, though, and I don't know how to proceed from there on.
Solution solution = MSBuildWorkspace.Create()
.OpenSolutionAsync(Path.Combine(repoRootFolder, "MySolution.sln"))
.Result;
ProjectDependencyGraph projdeps = solution.GetProjectDependencyGraph();
Digraph graph = new Digraph();
foreach (ProjectId projectId in projdeps.GetTopologicallySortedProjects())
{
string projName = solution.GetProject(projectId).Name;
var projDeps = projdeps.GetProjectsThatThisProjectDirectlyDependsOn(projectId);
foreach (ProjectId depId in projDeps)
{
Project dep = solution.GetProject(depId);
Compilation compilation = dep.GetCompilationAsync().Result;
foreach (var syntree in compilation.SyntaxTrees)
{
foreach (var classNode in syntree.GetRoot().DescendantNodes().OfType<ClassDeclarationSyntax>())
{
var classesThisClassNodeReferences = ?????????
}
}
string depName = dep.Name;
graph.Dependencies.Add(new Dependency
{
Source = projName,
Target = depName
});
}
}
推荐答案
我不确定你的要求,但你可以去检查类的所有后代 SyntaxNode
并得到对应的符号,和它的类型,然后收集这些类型.类似于以下内容:
I'm not sure about your requirements, but you can probably go for checking all descendant SyntaxNode
s of the class and get the corresponding symbol, and it's type, and then collect these types. Something like the following:
var semantic = compilation.GetSemanticModel(syntree);
var typesForCurrentClass = classNode.DescendantNodes().Select(n =>
semantic.GetTypeInfo(n).Type);
请注意,由于部分类的存在,给定的类符号可以有多个 typesForCurrentClass
.
Note that there can be multiple typesForCurrentClass
for a given class symbol because of partial classes.
这篇关于在 Roslyn 中获取类之间的依赖关系的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!