c# - 获取 Roslyn 类之间的依赖关系

标签 c# roslyn roslyn-code-analysis

我使用 Roslyn 成功获取项目之间的依赖关系,现在我想获取类之间的依赖关系,类似于 Visual Studio Enterprise 中的代码映射功能。

这是我的代码,“??????”部分是我想我可以得到一些东西的地方。不过,我对 Roslyn API 还很陌生,我不知道如何从那里开始。

        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 并获取相应的符号及其类型,然后收集这些类型。类似于以下内容:

var semantic = compilation.GetSemanticModel(syntree);
var typesForCurrentClass = classNode.DescendantNodes().Select(n => 
  semantic.GetTypeInfo(n).Type);

请注意,由于部分类,给定的类符号可以有多个 typesForCurrentClass

关于c# - 获取 Roslyn 类之间的依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39235100/

相关文章:

visual-studio-2017 - dotnet build 不显示 Visual Studio 所显示的 StyleCop 警告

c# - 在 WPF 中创建自定义关闭按钮

c# - 传入一定大小的数组以使用 xunit 进行测试

c# - 两次加载相同的程序集但版本不同

c# - 关闭已编程的应用程序后,系统句柄仍然存在。文件无法访问

c# - 使用 default 作为可为 null 的值类型参数的默认值不会分配 null

c# - 如何使用 Roslyn/代码分析读取 XML 文档注释

c# - 带有代码修复模板的分析器

C# Roslyn 替换方法

c# - 使用 .Net 编译器 Roslyn 为 C# 代码创建控制流图