检测C#代码中的递归调用

我想在我的代码中找到所有递归调用。

如果我在Visual Studio中打开文件,我会在编辑器的左侧看到“递归调用”图标。 在此处输入图像描述

我想检查这些电话的整个解决方案。

我使用Resharper命令行工具和VS的加载项Resharper – 代码检查没有运气,此规则未应用于其规则集。

有什么办法可以检查整个解决方案 – 我真的不想打开每个文件并检查那个蓝色的“递归调用”图标:)

编辑:我对单级递归很感兴趣

可以用Mono.Cecil做到这一点 。

这是一个简单的LINQPad程序,演示:

const string AssemblyFilePath = @"path\to\assembly.dll"; void Main() { var assembly = ModuleDefinition.ReadModule(AssemblyFilePath); var calls = (from type in assembly.Types from caller in type.Methods where caller != null && caller.Body != null from instruction in caller.Body.Instructions where instruction.OpCode == OpCodes.Call let callee = instruction.Operand as MethodReference select new { type, caller, callee }).Distinct(); var directRecursiveCalls = from call in calls where call.callee == call.caller select call.caller; foreach (var method in directRecursiveCalls) Debug.WriteLine(method.DeclaringType.Namespace + "." + method.DeclaringType.Name + "." + method.Name + " calls itself"); } 

这将输出直接调用自身的方法。 请注意,我只处理了Call指令,我不确定如何在这里正确处理其他调用指令,即使这是可能的。

警告 :请注意,这将是因为我只处理了那条单指令,只能处理静态编译的调用。

虚拟调用,通过接口调用,恰好回到相同的方法,将不会被检测到,需要更多高级代码。