我正在开发一个Roslyn分析器来检测特定方法method1
的使用。我想允许在for
和while
循环中使用此方法,并在代码中的所有其他情况下创建问题。
我该怎么做?我开发的代码在任何地方都检测到method1
。我现在每次找到该函数时都想要检查它是否处于循环中,并且只有当它不在循环中时才会生成错误。
答案 0 :(得分:2)
如果循环声明在其中,则方法调用将是循环声明的后代。您可以访问任何SyntaxNode
的{{3}}属性。在您检测到的MethodInvocation
节点的祖先之间开始上升,直到您遇到循环或成员声明。
如果您点击循环(ForStatementSyntax
或WhileStatementSyntax
),那么您就是好人。
如果你点击MemberDeclarationSyntax
节点,这意味着你已经到达了调用method1
的任何块的开头,并且可能会抛出错误。
此时,您的直接问题是主要已解决,您必须决定要覆盖多少个角落案例。如果从lambda表达式调用它会怎么样?如果从循环中调用调用method1
的方法会怎样?还是从递归方法?
您可以检测所有这些案例,但您必须决定是否值得付出努力。