【问题标题】:Roslyn CSharpSyntaxRewriter Get A List of Implemented InterfacesRoslyn CSharpSyntaxRewriter 获取已实现接口的列表
【发布时间】:2018-03-08 05:16:16
【问题描述】:

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

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

我无法找到从类和方法声明节点参数以及语法树或语法节点中获取此信息的方法。我还添加了 Compilation 作为 Constructor 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;
    } 
}

【问题讨论】:

    标签: c# roslyn


    【解决方案1】:

    你需要使用语义模型:

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

    【讨论】:

    • 我在这里遗漏了一些东西。从 SemanticModel 调用.GetType 不需要任何参数,它只是 Object 的标准 GetType。我想也许你的意思是 .GetTypeInfo(node) 它给你一个 TypeInfo 对象但没有任何“AllInterfaces”方法?
    • 我想也许你指的是 .GetSymbolInfo 脱离 scemanticmodel 但它只返回一个 SymbolInfo 而不是一个 ITypeSymbol。
    • 我找到了,它的 GetDeclaredSymbol 脱离了语义模型: var classSymbol = sModel.GetDeclaredSymbol(root.DescendantNodes().OfType().First());
    【解决方案2】:

    此信息可从类的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);
        }
    

    【讨论】:

      猜你喜欢
      • 2021-09-02
      • 2019-07-25
      • 2015-07-23
      • 2015-09-16
      • 2014-08-25
      • 2017-06-23
      • 1970-01-01
      • 2011-10-21
      • 2011-04-28
      相关资源
      最近更新 更多