gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:26:40 25 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

这可以通过 Roslyn api 来完成。算法如下:

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

下面的示例代码。我也在 github 中提交了这个.你会对sample unit tests感兴趣和 sample solution based on your example .我假设单个文件仅包含一个类定义,但我认为这应该足以让您开始。

        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);

关于c# - 如何以编程方式获取类依赖项及其各自的文件位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56120740/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com