我可以使用NDepend来统计类型转换吗?

8

我有一些继承来的代码,这些代码倾向于将对象作为接口(IFoo)传递,然后在代码的任意位置,将它们突然转换为这些接口的具体实现(例如,MyConcreteFoo)。

以下是一个愚蠢的例子:

public bool IsThisFooScaredOfMonkeys(IFoo foo)
{
    if (foo is MyConcreteFoo)
    {
        return ((MyConcreteFoo)foo).BelievesMonkeysAreEvil;
    }
    return false;
}

我想要做的是编写一个NDepend CQL查询,以捕获这些类型转换并按方法、类型或其他任何方式计数。这样我就知道从哪里开始集中精力来摆脱这种愚蠢行为,而不是让我的团队在代码中进行无目的的寻找... 是否有人知道如何做到这一点?我猜不能(需要这种特定功能的人不会太多),但我想先在这里问问... :-)
当然,任何关于使类型转换查找更快的想法也将同样受到欣赏。
1个回答

2
这会很好,但NDepend仅限于一组实体,不包括单个语句。 NDepend Entities
  1. 方法
  2. 字段
  3. 类型
  4. 命名空间
  5. 程序集
尽管存在此限制,NDepend仍然非常棒!也许这是下一个版本的功能。
现在,Patrick Smacchia可能会告诉我不同的情况,所以我会联系他询问。我期望能够很快得到回复,因为他对事情非常敏感。
顺便说一下:
如果您正在使用ReSharper 5.0,它有一个结构化搜索功能,可以让您查找类似于此类语句。您需要自己构建搜索,但这是一个非常强大的工具。
这个模式将捕捉到上面的示例。
if($fooObject$ is $concreteFoo$)
{
    return (($concreteFoo$)$fooObject$).$anyIdentifier$;
}

我确实有ReSharper 5.0,并且结构搜索链接给了我答案。对于任何其他好奇的人,我设置了几个搜索,一个用于查找“is”,另一个用于查找“as”(可能有一种方法将它们合并,但这对我有效)。搜索文本为“$foo$ as $fooClass$”,然后添加一个表达式类型的占位符“foo”,该占位符是IFoo或派生类型,并添加一个类型类型的占位符“fooClass”,该占位符也是IFoo或派生类型。哇,我得到了所有我们进行转换的地方的列表。谢谢Josh,这将使我的工作更轻松! - Christine Salter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接