C# 如何限制类型属性上的独立方法查询

C# 如何限制类型属性上的独立方法查询,c#,ndepend,cql,cqlinq,C#,Ndepend,Cql,Cqlinq,我试图让NDepend使用标准“methods to big”查询的修改版本来识别长方法 我不想报告开发人员几乎无法控制的长方法,因此我使用DebuggerNonUserCode属性和InitializeComponent()过滤掉生成的代码 不幸的是,我仍然得到一些误报,因为生成类型中的方法也被报告。问题在于,虽然类型本身具有DebuggerNonUserCode属性,但方法没有,因此尽管它们是生成的,但它们仍包含在输出中 我在寻找类型和方法之间的连接:给我所有没有DebuggerNonUse

我试图让NDepend使用标准“methods to big”查询的修改版本来识别长方法

我不想报告开发人员几乎无法控制的长方法,因此我使用
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

我非常喜欢NDepend,但它仍然是最大的单一缺点,即名称空间/类型/方法信息不能连接到单个查询中。这一特性将使CQL变得非常强大

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

Brian,这要感谢您所要求的代码规则的源代码是:

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语法还提供了一种定义我的代码的方法。此功能不可描述。基本上,您需要通过前缀为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默认查询

我找不到连接方法和类型信息的方法,甚至V3的发行说明也没有提到这一点。您尝试过IsGeneratedByCompiler方法属性吗?@Timores:没错,我希望我能在两者之间建立连接。我还没有看过IsGeneratedByCompiler。从文档来看,它似乎没有起到作用。但我还是会尝试一下并更新这个问题。我已经向NDepend的支持部门发送了一个请求。当我得到一些东西时,我会更新评论或发布答案。当然会的!我知道功能失效,但不幸的是,相关程序集将开发人员生成的代码和生成的代码都集中在同一名称空间中:(flq,Brian,看看我上面的答案:)