gpt4 book ai didi

c# - 使用 Roslyn 查找所有类声明而不是从另一个类继承

转载 作者:太空狗 更新时间:2023-10-29 21:12:38 29 4
gpt4 key购买 nike

我有一个 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 发现的类型。

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

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

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com