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

Dej*_*kić 21 c# resharper recursion code-analysis visual-studio

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

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

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

我使用Resharper命令行工具和VS的加载项Resharper - 代码检查没有运气,这个规则不适用于他们的规则集.

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

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

ang*_*son 23

可以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");
}
Run Code Online (Sandbox Code Playgroud)

这将输出直接调用自身的方法.请注意,我只处理的呼叫指令,我不能确定如何处理其他调用指令正确位置,甚至如果这甚至有可能.

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

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

  • 只是为了澄清,如果有人不确定; 你不需要Mono这样做.在LinqPad Pro中,您可以在"查询属性"窗口中添加NuGet包"Install-Package Mono.Cecil".如果你是一个便宜的滑板并拥有免费版本,那么你需要将nuget包下载到另一个临时项目中,然后使用Query Properties为查询添加其他程序集.否则ModuleDefinition.ReadModule将没有正确的引用. (2认同)