查找所有类声明,而不是使用Roslyn继承其他类声明

斯科特·麦凯(Scott Mackay)

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

例如

// 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)颇为陌生,非常感谢您提供有关实现此目标的任何建议或指示。

斯科特·麦凯(Scott Mackay)

所以我想出了以下内容,它将递归地检查所有类的继承类型

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<BaseClass>(symbol))
        {
            // hit!
        }
    }

    private bool InheritsFrom<T>(INamedTypeSymbol symbol)
    {
        while (true)
        {
            if (symbol.ToString() == typeof(T).FullName)
            {
                return true;
            }
            if (symbol.BaseType != null)
            {
                symbol = symbol.BaseType;
                continue;
            }
            break;
        }
        return false;
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

通过继承类中的声明获取当前类

来自分类Dev

如果部分类继承自某个类,那么所有其他具有相同名称的部分类也应该继承相同的基类吗?

来自分类Dev

使用声明的类或枚举

来自分类Dev

查找所有从基类继承的实例

来自分类Dev

从模板类继承,在子类中声明类型

来自分类Dev

jQuery使用类查找列表元素并隐藏其他所有内容

来自分类Dev

如何使用Roslyn获取方法调用/类声明的全名路径

来自分类Dev

如何从已经预先声明的类继承

来自分类Dev

如何使用模板声明成员函数?(不是模板类)

来自分类Dev

blazor页面模型局部声明中如何使用其他基类?

来自分类Dev

从抽象类继承以创建另一个抽象类时,我应该重新声明所有虚函数吗?

来自分类Dev

C ++通过接口使用从其他几个继承的类

来自分类Dev

声明其他类向符号的移动

来自分类Dev

C ++类声明(继承)

来自分类Dev

在Javascript的继承类中声明getter / setter

来自分类Dev

具有指定基类的类声明

来自分类Dev

我可以在其他类的main内部使用声明和分配的变量吗?

来自分类Dev

声明具有所有虚函数的类的对象

来自分类Dev

修改其他类中声明的对象的最佳方法(Java)

来自分类Dev

如何使用Roslyn正确修改类声明语法?

来自分类Dev

我可以在其他类中使用已声明的对象,而无需再次声明该对象吗?

来自分类Dev

使用继承并在其他类中调用

来自分类Dev

选择具有特定类而不是其他类的元素

来自分类Dev

从其他类声明类类型变量会导致 C2143 错误(在 '*" 之前缺少 ';' )

来自分类Dev

在其他类(不是 Form1)中声明和初始化复选框数组

来自分类Dev

只能声明从 NSObject 继承的类@objc

来自分类Dev

为什么有时在使用 Comparable 或其他接口时必须在尖括号中声明类类型?

来自分类Dev

使用“类”或“函数”声明类

来自分类Dev

是否可以在其他文件中的其他类主体内创建类而不是 C# 中的声明?

Related 相关文章

  1. 1

    通过继承类中的声明获取当前类

  2. 2

    如果部分类继承自某个类,那么所有其他具有相同名称的部分类也应该继承相同的基类吗?

  3. 3

    使用声明的类或枚举

  4. 4

    查找所有从基类继承的实例

  5. 5

    从模板类继承,在子类中声明类型

  6. 6

    jQuery使用类查找列表元素并隐藏其他所有内容

  7. 7

    如何使用Roslyn获取方法调用/类声明的全名路径

  8. 8

    如何从已经预先声明的类继承

  9. 9

    如何使用模板声明成员函数?(不是模板类)

  10. 10

    blazor页面模型局部声明中如何使用其他基类?

  11. 11

    从抽象类继承以创建另一个抽象类时,我应该重新声明所有虚函数吗?

  12. 12

    C ++通过接口使用从其他几个继承的类

  13. 13

    声明其他类向符号的移动

  14. 14

    C ++类声明(继承)

  15. 15

    在Javascript的继承类中声明getter / setter

  16. 16

    具有指定基类的类声明

  17. 17

    我可以在其他类的main内部使用声明和分配的变量吗?

  18. 18

    声明具有所有虚函数的类的对象

  19. 19

    修改其他类中声明的对象的最佳方法(Java)

  20. 20

    如何使用Roslyn正确修改类声明语法?

  21. 21

    我可以在其他类中使用已声明的对象,而无需再次声明该对象吗?

  22. 22

    使用继承并在其他类中调用

  23. 23

    选择具有特定类而不是其他类的元素

  24. 24

    从其他类声明类类型变量会导致 C2143 错误(在 '*" 之前缺少 ';' )

  25. 25

    在其他类(不是 Form1)中声明和初始化复选框数组

  26. 26

    只能声明从 NSObject 继承的类@objc

  27. 27

    为什么有时在使用 Comparable 或其他接口时必须在尖括号中声明类类型?

  28. 28

    使用“类”或“函数”声明类

  29. 29

    是否可以在其他文件中的其他类主体内创建类而不是 C# 中的声明?

热门标签

归档