使用roslyn

时间:2016-02-25 16:26:16

标签: c# roslyn

我正在寻找一种使用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);
            }
        }
    }
}

我开始使用样本"重新格式化解决方案"罗斯林团队提供的。但是,我无法找到一个公共API来从给定的类文件中提取接口。 当试图在Roslyn源代码中找到此功能时,我只能找到内部类。我找到了相关的班级 " SRC \功能\核心\便携式\ ExtractInterface"罗斯林源代码,我可以将它们复制到我的项目中并使其正常工作,但我宁愿不这样做。

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

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

1 个答案:

答案 0 :(得分:0)

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

string code = new StreamReader(filePath).ReadToEnd();
var syntaxTree = CSharpSyntaxTree.ParseText(code);
var syntaxRoot = syntaxTree.GetRoot(); 

IEnumerable<InterfaceDeclarationSyntax> interfaceDeclarations = syntaxRoot.DescendantNodes().OfType<InterfaceDeclarationSyntax>();

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