2016-05-19 11 views
3

weiß jemand wie ich alle verfügbaren Arten (die Semantik) innerhalb einer Lösung abrufen kann? Die Erstellung der Kompilation aus mehreren Projekten ist einfach.Abrufen aller Typen mit Roslyn innerhalb einer Lösung

MSBuildWorkspace workspace = MSBuildWorkspace.Create(); 
var solution = await workspace.OpenSolutionAsync(solutionPath, cancellationToken); 
var compilations = await Task.WhenAll(solution.Projects.Select(x => x.GetCompilationAsync(cancellationToken))); 

einfach alle ClassDeclarations iterieren ist nicht genug für mich, weil ich alle Arten und die Verbindung zwischen ihnen wollen.

foreach (var tree in compilation.SyntaxTrees) 
{ 
    var source = tree.GetRoot(cancellationToken).DescendantNodes(); 
    var classDeclarations = source.OfType<ClassDeclarationSyntax>(); 
} 

Antwort

3

Für eine gegebene Zusammenstellung können Sie alle verfügbaren Typen durch Compilation.GlobalNamespace erreichen, indem alle GetTypeMembers() und GetNamespaceMembers() rekursiv iterieren. Dadurch erhalten Sie nicht alle Typen in der Lösung, sondern alle Typen, die in der aktuellen Kompilierung (Projekt) über alle Referenzen verfügbar sind.

0
List<ISymbol> ls = new List<ISymbol>(); 
foreach (Document d in p.Documents) 
{ 
    SemanticModel m = d.GetSemanticModelAsync().Result; 
    List<ClassDeclarationSyntax> lc = d.GetSyntaxRootAsync().Result.DescendantNodes().OfType<ClassDeclaractionSyntax>().ToList(); 
    foreach (var c in lc) 
    { 
     ISymbol s = m.GetDeclaredSymbol(c); 
     ls.Add(s); 
    } 
} 
Verwandte Themen