我有一个CSharpCompilation实例,它包含一个SyntaxTree数组,并且我正在尝试查找从类继承的所有类声明。

例如

// Not in syntax tree but referenced in project
public class Base{}

// In syntax tree, how to find all such classes?
public class MyClass : Base {}

我已经尝试了一些方法,但是对所有选项都有些困惑,似乎找不到正确的方法来做到这一点。

我试图获取符号,但这不适用于继承的类型
SyntaxTree[] trees = context.CSharpCompilation.SyntaxTrees;
IEnumerable<ISymbol> symbols = context.CSharpCompilation.GetSymbolsWithName(x => x == typeof(Base).Name, SymbolFilter.Type);

罗斯林(Roslyn)相当陌生,非常感谢您提供有关实现此目标的任何建议或指示。

最佳答案

首先,您需要获取Base的符号。如果您是事先知道的特定类型,则可以为此使用Compilation.GetTypeByMetadataName。该链接还将向您显示100多种使用该方法的示例。

从那里开始,这取决于您要执行的操作。如果您是在分析器内部执行此操作(我怀疑您在代码中的“context.CSharpCompilation”中进行了此操作),并且试图标识然后检查这些派生类型的某些属性,则可以将RegisterSymbolAction用于SymbolKind。 NamedType,然后检查每种类型的BaseType(可能是递归的,具体取决于您要完成的工作),以查看是否找到了上述GetTypeByMetadataName发现的类型。

如果要在分析器的上下文之外进行解决方案范围的分析,那么Roslyn代码库中有一个helper for this,但这是内部的。有一个existing request可以公开ITypeSymbolExtensions,因此我在该请求中提到了该线程,并建议将其扩展为包括INamedTypeSymbolExtensions。

关于c# - 查找所有类声明,而不是使用Roslyn继承其他类声明,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28234052/

10-15 08:19