Что я пытаюсь сделать (работая с Roslyn/Microsoft.CodeAnalysis)
Я пытаюсь найти все символы интерфейсов, которые наследуются от определенного интерфейса, в решении, а также в сборках, на которые есть ссылки. Моя цель — сделать это максимально эффективно и чисто.
В то время, когда я это делаю, у меня есть следующие вещи:
- Рослин
Solution
. - Символ интерфейса, из которого я хочу найти производные интерфейсы.
подходы
Не работает
- At first I was trying to use the
SymbolFinder
, but the following approaches did not work:SymbolFinder.FindImplementationsAsync(interfaceSymbol, solution)
=> This approach does not work, as it's only returning classes, but no interfaces.SymbolFinder.FindDerivedClassesAsync(interfaceSymbol, solution)
=> Это также просто возвращает классы (как уже указано в названии метода)SymbolFinder.FindReferencesAsync(interfaceSymbol, solution)
=> Это просто возвращает ссылки в текущем решении, но не в сборках, на которые ссылаются.
Работающий
- Поскольку упомянутые попытки не привели к полезным результатам, моим последним средством был подход ручного перебора, когда я в основном собираю все
IAssemblySymbols
, перебираю все типы и проверяю интерфейс (выполняется рекурсивно, сSymbolVisitor
).
Так почему же я все равно ищу другое решение?
- Я ожидаю, что встроенное решение будет лучше с точки зрения производительности, так как может быть что-то уже кэшировано, или поскольку оно также может использовать другие структуры данных и т. д., как это имеет место в сценах в
SymbolFinder
- Кроме того: менее сложный, более стабильный, ...
Мой вопрос
- Существуют ли какие-либо более простые и потенциально более быстрые решения для этого (аналогичные тому, что уже предоставляет
SymbolFinder
)?