Опитах се да анализирам код и да преброя влагане, но имам проблеми с ламбда израз и анонимни методи. Опитах се да използвам VisitSimpleLambdaExpression() и VisitAnonymousMethodExpression(), но не ми помогна. Кажете ми някой друга идея за преброяване на влагането на ламбда изрази и анонимни методи? Текущият ми код:
class NestingLevelVisitor : SyntaxVisitor<int>
{
public override int VisitMethodDeclaration(MethodDeclarationSyntax node)
{
return Visit(node.Body);
}
public override int VisitBlock(BlockSyntax node)
{
if (node.Statements.Select(Visit).Count() == 0)
return 0;
return node.Statements.Select(Visit).Max();
}
public override int VisitExpressionStatement(ExpressionStatementSyntax node)
{
return 0;
}
public override int VisitAnonymousMethodExpression(AnonymousMethodExpressionSyntax node)
{
int result = Visit(node.Block);
return result + 1; //dont works
}
public override int VisitSimpleLambdaExpression(SimpleLambdaExpressionSyntax node)
{
Console.WriteLine(node.Body);
int result = Visit(node.Body);
return result + 1; //dont works
}
}
UPD: този пример демонстрира ламбда израз със скоби:
class Program
{
static void Main()
{
int m = 0;
document =>
{
return new InsertRequest(nominalType, document);
};
}
}
и влагане = 1
но ако използвам конструкция като тази:
bool f2()
{
int a = 1;
Func< bool, bool> not = b =>!b;
return 1;
}
гнезденето не се променя
този метод съдържа анонимен метод и влагане на този метод = 1:
static void Main()
{
Printer p = delegate(string j)
{
System.Console.WriteLine(j);
};
p("The delegate using the anonymous method is called.");
p = new Printer(TestClass.DoWork);
p("The delegate using the named method is called.");
}