查找所有类声明而不是从Roslyninheritance另一个类声明

我有一个包含一个SyntaxTree数组的CSharpCompilation实例,我试图找到从类inheritance的所有类声明

例如

 // Not in syntax tree but referenced in project public class Base{} // In syntax tree, how to find all such classes? public class MyClass : Base {} 

我尝试过一些东西但是对所有选项都有些困惑,似乎无法找到正确的方法来做到这一点。

我试图获取符号,但这对inheritance的类型不起作用

 SyntaxTree[] trees = context.CSharpCompilation.SyntaxTrees; IEnumerable symbols = context.CSharpCompilation.GetSymbolsWithName(x => x == typeof(Base).Name, SymbolFilter.Type); 

对Roslyn来说是一个新手,并且非常感谢任何有关如何实现这一目标的建议或指示。

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

从那里,它取决于你想要做什么。 如果您是从分析器内部(我怀疑您的代码中的“context.CSharpCompilation”)执行此操作,并且您尝试识别并检查这些派生类型的某些属性,则可以使用RegisterSymbolAction作为SymbolKind。 NamedType,然后检查每个类型的BaseType (可能递归,取决于您要完成的任务),以查看是否找到上面的GetTypeByMetadataName发现的类型。

如果您在分析器的上下文之外进行解决方案范围的分析,那么在Roslyn代码库中有一个帮助器 ,但它是内部的。 现有请求将ITypeSymbolExtensions公开,所以我在该请求中提到了这个线程并建议将其扩展为包含INamedTypeSymbolExtensions。

所以我想出了以下内容,它将以递归方式检查inheritance类型的所有类

 public class BaseClassRewriter : CSharpSyntaxRewriter { private readonly SemanticModel _model; public BaseClassRewriter(SemanticModel model) { _model = model; } public override SyntaxNode VisitClassDeclaration(ClassDeclarationSyntax node) { var symbol = _model.GetDeclaredSymbol(node); if (InheritsFrom(symbol)) { // hit! } } private bool InheritsFrom(INamedTypeSymbol symbol) { while (true) { if (symbol.ToString() == typeof(T).FullName) { return true; } if (symbol.BaseType != null) { symbol = symbol.BaseType; continue; } break; } return false; } } 
 var classDecSynList = classDecSynList.Where(x=> (((IdentifierNameSyntax(x.BaseList.Types.FirstOrDefault())) .Identifier.ValueText=="Base")); 

假设你有所有的类声明语法列表;