2016-02-25 73 views
0

我正在尋找一種方法來使用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擴展或分析器中完成的。

+0

您可能可以從MEF中按名稱提取「CodeRefactoringProvider」。 – SLaks

+0

以前沒有用過MEf,這將如何實現? – Patrick

回答

0

您可以使用下面的代碼語句從C#文件中獲取所有接口。

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

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

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

+1

嗨,感謝您的幫助,我剛剛意識到我的問題並不完全清楚。我想要的是一個公共API,我可以從C#中使用它以編程方式從類中提取接口。 (我也更新了這個問題) – Patrick