使用特定子类型调用时查找特定方法的用法

时间:2011-02-17 07:38:26

标签: c# .net refactoring code-analysis

我正在重构一个庞大的代码库中的讨厌,需要找到一个特定的方法,接受一个相当通用的接口的实例,用该接口的特定实现调用。

例如,NastyStaticDoBadThings(IBusinessObject)方法。我的业务库中有大约50个实现IBusinessObject的类,包括DontHurtMe : IBusinessObject

如何找到对NastyStatic.DoBadThings(foo)的每次通话,但仅限foo DontHurtMe的实例?

编辑:我正在使用某种静态分析工具。在DoBadThings(或类似)中设置动态监视并运行应用程序实际上不是一种选择。由于我对DontHurtMe所做的更改,它已经抛出一个异常,并且有太多的代码路径可以找到所有这些用法(至少在它上线并且我的用户开始抱怨之前)。

3 个答案:

答案 0 :(得分:5)

易。写一个以DontHurtMe为参数的DoBadThings重载。现在看看它的名字。这不会检测使用声明的IBusinessObject调用该方法的情况发生是DontHurtMe - 但我不认为静态分析可以检测到这种情况。这将使用声明 DontHurtMe。

获取方法的所有调用

答案 1 :(得分:2)

ReSharper 5的结构搜索可以做到这一点。假设以下代码:

class Program
{
    static void Main(string[] args)
    {

        var hm = new HurtMe();
        var dhm = new DontHurtMe();

        DoBadThings(hm);

        DoBadThings(dhm);

    }

    static void DoBadThings(IBusinessObject ibo) { }
}

interface IBusinessObject { }

class DontHurtMe : IBusinessObject { }

class HurtMe : IBusinessObject { }

现在,如上所述,Find Usages上的R#DoBadThings,无论我们指定哪个选项,都会在Main中找到这两个调用。

但是如果我们

  1. 转到ReSharper | Find | Search with Pattern....
  2. Add Placeholder | Expression,将其命名为dhm并指定DontHurtMe作为类型
  3. Search pattern中,输入DoBadThings($dbm$)
  4. 点击查找
  5. 我们在结果中在对象上调用DoBadThings,其类型可静态识别为DontHurtMe,而调用在HurtMe


    我确实喜欢@Carl Manaster提供的程序的整洁性,但是当你不能重载有问题的方法时,这种方式提供了一个选项。

答案 2 :(得分:0)

我无法想出静态分析的解决方案。我刚刚重新检查了ReSharper的“Find usages advanced ...”的选项,但没有找到任何东西。您可以使用类似foo is DontHurtMe的条件在此方法上放置一个条件断点,但我想您已经知道它,并且它更适合于您尝试查找错误而非重构目的的情况。