如何在类型属性上限制NDepend方法查询

时间:2010-03-04 12:01:16

标签: c# ndepend cql cqlinq

我正在尝试让NDepend使用标准的“方法太大”查询的修改版本来识别长方法。

我不想报告开发人员无法控制的长方法,因此我使用DebuggerNonUserCode属性和InitializeComponent()过滤掉生成的代码。

不幸的是,由于生成类型中的方法也被报告,我仍然会得到一些误报。问题是虽然类型本身具有DebuggerNonUserCode属性,但方法却没有,因此尽管它们是生成的,但它们仍包含在输出中。

我正在寻找类似于类型和方法之间的连接的东西:给我所有没有DebuggerNonUserCode属性的类型并对其运行查询,但我无法弄清楚如何在CQL。

对于某些程序集,我可以简单地过滤全名,但不幸的是我们的一些程序集混合了开发人员制作和生成的类型。不幸的是,IsGeneratedByCompiler在这种情况下也不能使用。

我的查询

WARN IF Count > 0 IN SELECT METHODS WHERE 
   NbLinesOfCode > 30 AND
   !HasAttribute "System.Diagnostics.DebuggerNonUserCodeAttribute" AND
   !NameIs "InitializeComponent()"
   ORDER BY NbLinesOfCode DESC

2 个答案:

答案 0 :(得分:2)

Brian,感谢Code Rule over LINQ Query (CQLinq)您要求的代码规则的源代码是:

warnif count > 0
from m in Application.Methods where
  m.NbLinesOfCode > 30 &&
 !m.ParentType.HasAttribute( "System.Diagnostics.DebuggerNonUserCodeAttribute") &&
  m.Name != "InitializeComponent()"
orderby m.NbLinesOfCode descending
select new { m, m.NbLinesOfCode }

CQLinq语法还提供了一种定义 Just-My-Code 的方法。此功能描述为here。基本上,您需要通过前缀为 notmycode 的查询来定义集合 JustMyCode 。然后,您要求的规则可以轻松重写:

warnif count > 0
from m in JustMyCode.Methods where
   m.NbLinesOfCode > 30
orderby m.NbLinesOfCode descending    
select new { m, m.NbLinesOfCode }

为所有人定义的一次 JustMyCode 可以在任何代码规则上重复使用。另外,您可以查看 notmycode 默认查询Discard generated and designer Methods from JustMyCode

答案 1 :(得分:0)

我非常喜欢NDepend,但它仍然是命名空间/类型/方法信息无法加入单个查询的最大单一缺点。该功能将使CQL成为真正强大的东西。

除此之外,检查' IsGeneratedByCompiler '和' IsInFrameworkAssembly '可能会有所帮助。 您还可以从查询中删除某些名称空间( OUT OF NAMESPACES“......”