2

我正在尝试在 Visual NDepend 中编写 CQL 查询,以查找不直接依赖于命名空间列表中任何类型的所有类型和方法。

到目前为止,我构建的查询是这样的:

SELECT METHODS
WHERE 
   !IsDirectlyUsing "NAMESPACE:Microsoft.*"
   AND !IsDirectlyUsing "NAMESPACE:System.Web.UI.*"
   AND !FullNameLike ".Test"
   AND !HasAttribute "System.CodeDom.Compiler.GeneratedCodeAttribute"
   AND FullNameLike "OurOwnNameSpaceHere"

但这仍然返回接受 SPWeb 作为参数的方法,所以我一定遗漏了一些东西。

所以我想:

  • 排除依赖于 Microsoft.* 命名空间内的任何引用程序集内的任何类型的任何方法。

  • 排除依赖于 System.Web.Ui.* 命名空间内的任何引用程序集内的任何类型的任何方法。

  • 排除任何生成的方法/类型

  • 排除属于在命名空间中具有 Test 的项目的任何方法。

失败的示例方法是:

public void SomeMethod(SPWeb web)
{
    ... // other code here
    SomeOtherMethod(web);
    ...
}
4

1 回答 1

1

您可以通过 LINQ(CQLinq 查询)尝试以下代码查询:

let dontUseTypes = Namespaces
                   .WithNameWildcardMatchIn("Microsoft.*", "System.Web.UI.*")
                   .ChildTypes()

from m in JustMyCode.Methods.Except(Methods.UsingAny(dontUseTypes))
where !m.ParentAssembly.Name.ToLower().Contains("test")
select m

排除任何生成的方法/类型的条件由我们使用 JustMyCode的事实处理。

那么,该方法使用的哪些方法或字段SPWeb仍然匹配?NDepend 可以检测到一个方法仅在使用该类型的成员时才使用该类型。

于 2011-12-06T14:14:45.420 回答