如何以编程方式获取类依赖项及其各自的文件位置?

2024-04-02

我需要获得给定项目的类之间的某种依赖关系图,即该特定类使用的所有类。我想知道给定的类正在使用哪些类,以便以后可以在项目中找到它们的文件路径。考虑以下简单示例:

public class Dog: Animal, IBark
{
    public void Bark()
    {
        // Code to bark.
    }

    public void Fight(Cat cat)
    {
        // Code to fight cat.
    }
}

对于这个具体的例子,我想知道哪些类Dog类用途。所以我想以编程方式访问具有这些依赖项的对象。在这种情况下,该对象将包含IBark, Animal and Cat类/接口以及可能它们各自的文件路径。

这在 C# 中可能吗?我尝试研究 Roslyn API,虽然我可以解析文档并遍历它来查找节点,但我还没有找到一种方法来获取与这些节点相关的元数据,这些元数据可能会给我我正在寻找的内容(例如文件路径) 。这让我想知道是否有更好的方法来解决这个问题。


这可以通过以下方式完成Roslyn蜜蜂。算法如下:

  1. 加载解决方案 (.sln)
  2. 迭代项目 (.csproj)
  3. 迭代项目内的文档 (.cs)
  4. Load semantic model对于文档
  5. Get SyntaxTree并遍历所有SyntaxNode
  6. 检测每个SyntaxNode具体类型。如果检测到的语法是类定义(比方说 Dog) - 继续遍历,考虑到进一步检测到的类或接口依赖于 Dog

下面的示例代码。我也犯了这个github https://github.com/amikulich/ArchitectureGuards。您将会感兴趣单元测试样本 https://github.com/amikulich/ArchitectureGuards/tree/master/ArchitectureGuards/ArchitectureGuards.Tests/DependencyGraph and 基于您的示例的示例解决方案 https://github.com/amikulich/ArchitectureGuards/tree/master/Samples/DependencyGraph/SampleProject1ForDependencyGraph。我假设单个文件仅包含一个类定义,但是我认为这应该足以让您开始。

        var dependencies = new Dictionary<string, List<string>>(); 
        //key - class name, value - list of dependent class names

        var project = workspace.CurrentSolution.Projects.First();

        foreach (var document in project.Documents)
        {
            var semanticModel = await document.GetSemanticModelAsync();
            KeyValuePair<string, List<string>>? keyValue = null;

            foreach (var item in semanticModel.SyntaxTree.GetRoot().DescendantNodes())
            {
                switch (item)
                {
                    case ClassDeclarationSyntax classDeclaration:
                    case InterfaceDeclarationSyntax interfaceDeclaration:
                        if (!keyValue.HasValue)
                        {
                            keyValue = new KeyValuePair<string, List<string>>(semanticModel.GetDeclaredSymbol(item).Name, new List<string>());
                        }
                        break;
                    case SimpleBaseTypeSyntax simpleBaseTypeSyntax:
                        keyValue?.Value.Add(simpleBaseTypeSyntax.Type.ToString());
                        break;
                    case ParameterSyntax parameterSyntax:
                        keyValue?.Value.Add(parameterSyntax.Type.ToString());
                        break;
                }
            }

            if (keyValue.HasValue)
            {
                dependencies.Add(keyValue.Value.Key, keyValue.Value.Value);
            }
        }

对于上面的代码,工作区是通过以下方式加载的:

var workspace = MSBuildWorkspace.Create();
await workspace.OpenSolutionAsync(solutionFilePath);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何以编程方式获取类依赖项及其各自的文件位置? 的相关文章

  • C# 打印问题(RichTextBox)

    我想打印我的 RichTextBox eintragRichTextBox 的内容 我现在有这个代码 private void druckenPictureBox Click object sender EventArgs e PrintD
  • 如何在另一个应用程序中挂钩 api 调用

    我正在尝试挂钩另一个应用程序的 ExtTextOut 和 DrawTextExt GDI 方法调用 我知道我需要使用 GetProcAddress 来查找 gdi32 dll 中那些方法的地址 并用我的函数的地址覆盖我想要挂钩的进程中的地址
  • 删除是如何工作的? [复制]

    这个问题在这里已经有答案了 可能的重复 C 编程 free 如何知道要释放多少 https stackoverflow com questions 1518711 c programming how does free know how m
  • 将完整模板参数值映射到原始类型

    我想将数字映射到类型 在这个例子中 我将创建一个函数 将 sizeof 结果映射到有符号的原始类型 我想知道是否有更好的方法来完成我在现代 C 中所做的事情 即采用模板化值并将其转换为类型 现在 这可以将大小转换为已知类型 但我似乎无法在标
  • 检测到堆栈崩溃

    我正在执行我的 a out 文件 执行后 程序运行一段时间 然后退出并显示消息 stack smashing detected a out terminated Backtrace lib tls i686 cmov libc so 6 f
  • C# 5 async/await 线程机制感觉不对?

    为什么让调用线程进入异步方法直到内部 等待 一旦调用异步方法就生成一个线程 这不是更干净吗 这样您就可以确定异步方法会立即返回 您不必担心在异步方法的早期阶段没有做任何昂贵的事情 我倾向于知道某个方法是否要在 我的 线程上执行代码 不管是堵
  • 计算另一个表达式中的 C# 表达式

    我想在另一个表达式中使用一个表达式 Expression
  • 为什么'enable_if'不能用于禁用这里声明

    include
  • C# 开源 NMEA 解析器 [已关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找 C 开源 NMEA 解析器 嗯 我自己也不熟悉 但是一些快速搜索显示了一个代码项目 htt
  • 使用查询表达式对 List 进行排序

    我在使用 Linq 订购这样的结构时遇到问题 public class Person public int ID get set public List
  • 将接口转换为其具体实现对象,反之亦然?

    在 C 中 当我有一个接口和几个具体实现时 我可以将接口强制转换为具体类型 还是将具体类型强制转换为接口 这种情况下的规则是什么 Java 和 C 中都允许这两个方向 向下转型需要显式转型 如果对象类型不正确 可能会抛出异常 然而 向上转换
  • 根据对象变量搜索对象列表

    我有一个对象列表 这些对象具有三个变量 ID 名称和值 这个列表中可能有很多对象 我需要根据ID或Name找到一个对象 并更改值 例子 class objec public string Name public int UID public
  • 如何使用 NPOI 按地址(A1、A2)获取 Excel 单元格值

    我有一个 Excel 单元格地址 例如 A1 A2 如何使用 C 中的 NPOI 框架以编程方式访问此单元格 我找到的一些 Java POI 示例代码 CellReference cr new CellReference A1 row my
  • 如何从 Rx Subscribe 回调异步函数?

    我想回调 Rx 订阅中的异步函数 例如 像那样 public class Consumer private readonly Service service new Service public ReplaySubject
  • .NET 4 的条件编译[重复]

    这个问题在这里已经有答案了 可能的重复 条件编译和框架目标 https stackoverflow com questions 2923210 c sharp conditional compilation and framework ta
  • 需要提取字符串中点后的最后一个数字,如“7.8.9.1.5.1.100”

    我需要提取 C 字符串中最后一个点后面的最后一个数字 例如 7 8 9 1 5 1 100 并将其存储在整数中 Added 该字符串也可以是 7 8 9 1 5 1 1 或 7 8 9 1 5 1 0 我还想验证它在最后一个点之前恰好是 7
  • 使用 using 声明时,非限定名称查找如何工作?

    根据 C 标准 这是格式错误还是格式良好 namespace M struct i namespace N static int i 1 using M i using N i int main sizeof i Clang 拒绝它 GCC
  • INotifyPropertyChanged 和 propertyName

    我一直不确定它的含义propertyName实施时INotifyPropertyChanged 所以一般来说你实现INotifyPropertyChanged as public class Data INotifyPropertyChan
  • 如何使用placement new重新初始化该字段?

    我的课程包含字段 private OrderUpdate curOrderUpdate 我一遍又一遍地使用它 经常需要重新初始化 for int i 0 i lt entries size i auto entry entries i ne
  • 结构化绑定的用例有哪些?

    C 17 标准引入了新的结构化绑定 http en cppreference com w cpp language structured binding功能 最初是proposed http www open std org jtc1 sc

随机推荐

  • 如何从 GAC 加载程序集?

    我正在尝试使用 Assembly Load 加载 GAC 中的程序集 例如 假设我想列出存在于的所有类型演示核心 dll 我该如何加载演示核心 dll 当我尝试这个时 Assembly a Assembly Load Presentatio
  • MUI:如何以编程方式删除 DataGrid 中选定的行?

    我正在使用 MUI 创建文件列表DataGrid 用户可以选中复选框DataGrid做出他们的选择 我希望在用户执行某些操作 例如删除所选文件 后重置该复选框 我面临的问题是在执行删除操作后 该复选框仍然在同一位置被选中 例如 在我按下删除
  • 更改搜索栏拇指的大小

    我正在使用可绘制的搜索栏拇指 android thumb drawable thumb 我怎样才能设置这个拇指的大小dip单元 因为我使用类似搜索栏的样式 我想要拇指12dip高度和宽度 对我来说设置拇指大小的最灵
  • org.springframework.beans.factory.BeanCreationException:创建类路径资源中定义的名称为“scriptDataSourceInitializer”的bean时出错?

    我是学习 Spring Boot Web 的新手 我已经开始学习 spring jpa 数据 我使用 h2 数据库 我想使用插入测试数据 org springframework beans factory BeanCreationExcep
  • 仅显示 SQL 查询的前 N ​​行输出

    有没有办法只显示前 N 行输出SQL query 如果查询停止运行一次 则奖励积分N输出行 我最感兴趣的是找到适用于的东西Oracle 如果您指定您的目标数据库将会很有帮助 不同的数据库有不同的语法和技术来实现这一点 例如 在 Oracle
  • Git:如何排除存储库中的子文件夹?

    我已经在我的项目的文件夹中创建了一个存储库 你知道 git init 我有Webstorm文件夹 idea另一个与此无关的文件夹 我对保留在存储库中不感兴趣 并且我不希望此文件夹显示为要添加的新文件 我想忘记这些子文件夹 如何在提交整个存储
  • vertx 内的多线程

    我是 vert x 的新手 我正在尝试 vert x NetServer 功能 http vertx io core manual java html writing tcp servers and clients http vertx i
  • 下载 Fuchsia 源代码 - Jiri 钩子由于更新项目或包时出现致命错误而未运行

    Per 获取紫红色源代码 https fuchsia dev fuchsia src development source code echo PATH media cwh 32GB swdev fuchsia jiri root bin
  • 如何在 SQLite 中拥有自动时间戳?

    我有一个 SQLite 数据库版本 3 我正在使用 C 创建一个使用该数据库的应用程序 我想在表中使用时间戳字段来实现并发 但我注意到当我插入新记录时 该字段未设置 并且为空 例如 在 MS SQL Server 中 如果我使用时间戳字段
  • OpenCV 使用 k 均值对图像进行色调分离

    我想在 C 接口 cv 命名空间 中使用 k means 和 OpenCV 对图像进行色调分离 但得到了奇怪的结果 我需要它来减少一些噪音 这是我的代码 include cv h include highgui h using namesp
  • 在 AngularJS 中下载 zip 文件

    尝试在 AngularJS 中下载 zip 文件 我查看了AngularJS 从服务器下载pdf文件 https stackoverflow com questions 25490007 angularjs download pdf fil
  • 按时间间隔分组

    我需要将我的表分组为 15 分钟的间隔 我可以这样做 select dateadd minute datediff minute 0 ts 15 15 0 sum goodpieces from StationCount Group by
  • 在mongodb中查找按距离排序的LineString附近的点

    我有一组代表街道 黑线 的点和代表地图上某个地点的点 红点 我想找到指定街道附近的所有点 按距离排序 我还需要能够指定最大距离 蓝色和绿色区域 这是一个简单的例子 我想用 near运算符 但它只接受Point作为输入 而不是LineStri
  • 如何确定您是否使用不带 $_SERVER['HTTPS'] 的 HTTPS

    我在网上看到很多教程说你需要检查 SERVER HTTPS 如果服务器连接受 HTTPS 保护 我的问题是在我使用的一些服务器上 SERVER HTTPS 是一个未定义的变量 会导致错误 我可以检查是否还有另一个应该始终定义的变量 需要明确
  • NSExtensionRequestHandling 不处理本机消息

    我正在尝试为我的本机应用程序创建 Safari Web 扩展 我想要一个带有按钮的弹出窗口 单击该按钮将与我的本机应用程序进行通信 在开始这部分之前 我在发送本机消息并在其中处理它时遇到了问题beginRequest类中的函数符合NSExt
  • 如何确定 UIWebView 的内容大小?

    我有一个UIWebView具有不同的 单页 内容 我想了解一下CGSize内容以适当调整我的父母视图的大小 显而易见的 sizeThatFits 不幸的是只返回 webView 的当前帧大小 事实证明 我的第一个猜测是使用 sizeThat
  • 使用继承时出现重复的外键

    我创建了这些类 以便通过 EntityFramework 6 代码优先方法生成数据库模型 public class Vehicle public long Id get set public long ResponsiblePersonId
  • 卡兹马兹动画

    我正在寻求帮助 我想在 Matlab 上为 Kaczmarz 方法制作动画 它的方法允许通过在超平面上的串行投影解向量来找到方程组的解 该解向量由系统方程组给出 我想制作该矢量移动的动画 就像该点在投影矢量上一样 System of equ
  • Joomla 3.2.3 精选文章排序

    在 Joomla 3 2 3 中 我无法像 J 1 5 x 那样进行文章排序 我想让首页文章排序像我在管理员区域中定义的那样 我尝试了几种方法 但仍然没有任何成功 已经 1 周了 我最后一次尝试的是这样的 a Content gt Feat
  • 如何以编程方式获取类依赖项及其各自的文件位置?

    我需要获得给定项目的类之间的某种依赖关系图 即该特定类使用的所有类 我想知道给定的类正在使用哪些类 以便以后可以在项目中找到它们的文件路径 考虑以下简单示例 public class Dog Animal IBark public void