2017-02-14 3 views
0

Я пытаюсь получить список всех типов в VS-решении, унаследованном от определенного типа. Ниже код кажется перечислить все классы в против решения, но не знаю, как фильтровать их по inhertance:Как перечислить все типы, унаследованные от определенного типа в решении?

var workspace = MSBuildWorkspace.Create(); 
CancellationToken cancellationToken = default(CancellationToken); 
var solution = await workspace.OpenSolutionAsync(path, cancellationToken); 
Project project = solution.Projects.First(p => p.Name == "WebApplication1"); 
var compilation = await project.GetCompilationAsync(); 

var classes = compilation. 
    GlobalNamespace. 
    GetNamespaceMembers(). 
    SelectMany(x => x.GetMembers()); 

ответ

4

Вы ищете SymbolFinder.FindDerivedClassesAsync().

Используя ваш пример это будет выглядеть примерно так:

var workspace = MSBuildWorkspace.Create(); 
CancellationToken cancellationToken = default(CancellationToken); 
var solution = await workspace.OpenSolutionAsync(path, cancellationToken); 

INamedTypeSymbol symbol = ... //Find the symbol for the type you're interested interested 
var results = await SymbolFinder.FindDerivedClassesAsync(symbol, solution); 

Обратите внимание, что в то время как этот пример для классов, SymbolFinder имеет методы для различных сценариев, включая нахождение реализаций интерфейсов.

+0

Большое вам спасибо. –

+0

Джош, ты так быстро пригвоздил этот вопрос. Каковы хорошие ресурсы, которые я должен знать о Roslyn? Поиск в Google не очень помогает, поскольку обыски обычно попадают в исходный репозиторий Roslyn, что не очень полезно. Любая хорошая книга, которую вы рекомендуете? Еще раз спасибо. –

+0

К сожалению, документации не так много, но я написал несколько сообщений в блоге о Roslyn, пока я изучал его: https://joshvarty.wordpress.com/learn-roslyn-now/ – JoshVarty

Смежные вопросы