如何使用C#Roslyn测量方法的嵌套级别

如何使用C#Roslyn测量方法的嵌套级别,c#,nested,nodes,roslyn,C#,Nested,Nodes,Roslyn,我想使用Roslyn度量方法的“嵌套级别”,例如:如果方法只包含一个表达式,则其级别为0。如果方法包含嵌套的If(cond1)If(cond2)则其级别为1 我尝试使用Roslyn的节点,但我不明白如何只获取while或if结构的主体,而不获取其条件和其他内容。您可以使用SyntaxVisitor实现这一点:它递归地遍历语法树,并根据其类型为每个节点执行代码 您需要指定各种语句的行为方式。例如: 对于简单语句(如ExpressionStatementSyntax),只需返回0 对于嵌套语句(包

我想使用Roslyn度量方法的“嵌套级别”,例如:如果方法只包含一个表达式,则其级别为0。如果方法包含嵌套的
If(cond1)
If(cond2)
则其级别为1


我尝试使用Roslyn的节点,但我不明白如何只获取while或if结构的主体,而不获取其条件和其他内容。

您可以使用
SyntaxVisitor
实现这一点:它递归地遍历语法树,并根据其类型为每个节点执行代码

您需要指定各种语句的行为方式。例如:

  • 对于简单语句(如
    ExpressionStatementSyntax
    ),只需返回0
  • 对于嵌套语句(包括
    IfStatementSyntax
    和其他几个语句),返回其子语句的深度+1。通过递归调用子对象的
    Visit()
    ,可以获得子对象的深度
  • 对于
    BlockSyntax
    ,返回其子级的最大深度
在代码中,这看起来像:

class NestingLevelVisitor : SyntaxVisitor<int>
{
    public override int DefaultVisit(SyntaxNode node)
    {
        throw new NotSupportedException();
    }

    public override int VisitMethodDeclaration(MethodDeclarationSyntax node)
    {
        return Visit(node.Body);
    }

    public override int VisitBlock(BlockSyntax node)
    {
        return node.Statements.Select(Visit).Max();
    }

    public override int VisitExpressionStatement(ExpressionStatementSyntax node)
    {
        return 0;
    }

    public override int VisitIfStatement(IfStatementSyntax node)
    {
        int result = Visit(node.Statement);

        if (node.Else != null)
        {
            int elseResult = Visit(node.Else.Statement);
            result = Math.Max(result, elseResult);
        }

        return result + 1;
    }
}
MethodDeclarationSyntax method = …;
int methodNestingLevel = new NestingLevelVisitor().Visit(method);

将代码张贴在您面临的问题上。我的问题是我缺乏知识,我只想知道如何获得这样的子节点:如果我们的节点是Console.WriteLine(),那么它没有子节点。我还没有密码。我只需要像“body”这样的子节点,如果没有,则需要-null。没有它,我就不知道该怎么写,我所有的尝试都是垃圾。如果您能帮助我了解如何“过滤”节点,我知道如何递归地编写它。