我正在重构一个庞大的代码库中的讨厌,需要找到一个特定的方法,接受一个相当通用的接口的实例,用该接口的特定实现调用。
例如,NastyStatic
是DoBadThings(IBusinessObject)
方法。我的业务库中有大约50个实现IBusinessObject
的类,包括DontHurtMe : IBusinessObject
。
如何找到对NastyStatic.DoBadThings(foo)
的每次通话,但仅限foo
DontHurtMe
的实例?
DoBadThings
(或类似)中设置动态监视并运行应用程序实际上不是一种选择。由于我对DontHurtMe
所做的更改,它已经抛出一个异常,并且有太多的代码路径可以找到所有这些用法(至少在它上线并且我的用户开始抱怨之前)。
答案 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
中找到这两个调用。
但是如果我们
ReSharper | Find | Search with Pattern....
Add Placeholder
| Expression
,将其命名为dhm
并指定DontHurtMe
作为类型Search pattern
中,输入DoBadThings($dbm$)
我们在结果中仅在对象上调用DoBadThings
,其类型可静态识别为DontHurtMe
,而不调用在HurtMe
。
我确实喜欢@Carl Manaster提供的程序的整洁性,但是当你不能重载有问题的方法时,这种方式提供了一个选项。
答案 2 :(得分:0)
我无法想出静态分析的解决方案。我刚刚重新检查了ReSharper的“Find usages advanced ...”的选项,但没有找到任何东西。您可以使用类似foo is DontHurtMe
的条件在此方法上放置一个条件断点,但我想您已经知道它,并且它更适合于您尝试查找错误而非重构目的的情况。