Roslyn CSharpSyntaxRewriter获取已实现接口的列表

时间:2018-03-07 19:28:05

标签: c# roslyn

我有一个实现CSharpSyntaxRewriter的CustomRewriter。在VisitClassDeclaration或VisitMethodDeclaration中,我需要检查该类可能实现的任何接口。

原因是VisitMethodDeclaration正在寻找进行数据调用的方法,并且正在向方法添加参数。这很有效。但是,如果修改方法签名,我需要它来检查Method的更改是否来自已实现的接口,如果是,则修改接口。

我无法找到从Class& amp;获取此信息的方法。方法DeclarationNode参数,也不是语法树或语法节点。我还添加了Compilation作为构造函数Parm,以便使用它来获取SchematicModel并以某种方式从那里开始,但没有任何运气。

public class DetermineIfInterfaceMethodRewriter : CSharpSyntaxRewriter
{
    private string Test = string.Empty;
    private Compilation comp;
    public DetermineIfInterfaceMethodRewriter(Compilation compilation)
    {
        this.comp = compilation;
    }
    public override SyntaxNode VisitClassDeclaration(ClassDeclarationSyntax node)
    {  
        return base.VisitClassDeclaration(node);
    }
    public override SyntaxNode VisitMethodDeclaration(MethodDeclarationSyntax node)
    {
        var tree = node.SyntaxTree;
        var root = tree.GetRoot();

        return node;
    } 
}

2 个答案:

答案 0 :(得分:1)

您需要使用语义模型:

  1. 致电GetDeclaredSymbol(classDeclarationSyntax)获取该课程的ITypeSymbol
  2. 调用AllInterfaces以获取其所有已实现的接口。

答案 1 :(得分:1)

此信息可从INamedTypedSymbol获取,可通过SemanticModel GetDeclaredSymbol方法获取。获得类的符号后,可以调用AllInterfaces来获取已实现接口的集合。

    public override SyntaxNode VisitClassDeclaration(ClassDeclarationSyntax node)
    {
        var tree = node.SyntaxTree;
        var root = tree.GetRoot();            
        var sModel = comp.GetSemanticModel(node.SyntaxTree);
        var classSymbol = sModel.GetDeclaredSymbol(root.DescendantNodes().OfType<ClassDeclarationSyntax>().First());

        var implementedInterfaces = classSymbol.AllInterfaces;

        return base.VisitClassDeclaration(node);
    }