使用 Roslyn 以编程方式提取接口

本文关键字:方式提 取接口 编程 Roslyn 使用 | 更新日期: 2023-09-27 18:36:23

我正在寻找一种使用 Roslyn 从文档(c# 类声明)中提取接口的方法。从重新格式化程序示例开始。

MSBuildWorkspace workspace = MSBuildWorkspace.Create();
// Open the solution within the workspace.
Solution originalSolution = workspace.OpenSolutionAsync(project).Result;
// Declare a variable to store the intermediate solution snapshot at each step.
MSBuildWorkspace workspace = MSBuildWorkspace.Create();
Solution originalSolution = workspace.OpenSolutionAsync(project).Result;
Solution newSolution = originalSolution;
foreach (ProjectId projectId in originalSolution.ProjectIds)
{
    // Look up the snapshot for the original project in the latest forked solution.
    Project proj = newSolution.GetProject(projectId);
    var comp = proj.GetCompilationAsync().Result;
    ///var bind = comp.
    if (proj.Name.EndsWith("Core.DataLayer"))
    {
        foreach (DocumentId documentId in proj.DocumentIds)
        {
            Document document = newSolution.GetDocument(documentId);
            if (IsRepositoryDocument(document))
            {
                //How to implement this?
                var newinterface = GetInterfaceFromRespository(document);
            }
        }
    }
}

我开始使用 Roslyn 团队提供的示例"重新格式化解决方案"。但是,我找不到公共 API 来从给定的类文件中提取接口。当尝试在 Roslyn 源代码中找到此功能时,我只能找到内部类。我在 中找到
了相关类Roslyn 源代码的"src''Features''Core''Portable''ExtractInterface",我可以将它们复制到我的项目中并使其正常工作,但我宁愿不这样做。

TLDR;是否有一个公共 API 可以从 C# 以编程方式从类中提取接口?

请注意,这是在"常规"C# 项目中完成的,而不是在 Visual Studio 扩展或分析器中完成的。

使用 Roslyn 以编程方式提取接口

可以使用以下代码语句从 C# 文件中获取所有接口。

string code = new StreamReader(filePath).ReadToEnd();
var syntaxTree = CSharpSyntaxTree.ParseText(code);
var syntaxRoot = syntaxTree.GetRoot(); 
IEnumerable<InterfaceDeclarationSyntax> interfaceDeclarations = syntaxRoot.DescendantNodes().OfType<InterfaceDeclarationSyntax>();

然后,您可以迭代文件中的可用接口。