3

我正在尝试使用 NDepend 及其基于 Linq 的查询语言来生成一些关于代码当前状态的报告。我想用预定义的“标签”标记我的一些方法和类,例如用标签“数据库”标记的方法包含特定于数据库的代码,用标签“算法_X”标记的方法包含与算法“X”相关的特定逻辑。我们认为这样的标记过程将导致更直接的文档生成过程。

我想知道 NDepend 是否提供了一种机制来促进这样的过程。我正在考虑使用 C# 属性来生成这样的自定义标签,然后使用与“标记”它们相对应的适当属性来标记方法。我很清楚 CQLinq 的“.HasAttribute”方法并积极使用它。但是这个标记过程需要一种方法来列出或枚举附加到方法的所有属性,直到现在我才使用 NDepend 实现它。

我的问题是;有没有办法在 NDepend 中实现它(列出方法的所有属性)?如果没有,NDepend 中是否有另一种方法可以促进这样的标记过程?我可以通过编写自定义 C# 代码使用反射来实现这一点,但我想确保在这种状态下我没有 NDepend 的选项。

4

1 回答 1

4

您实际上可以列出使用NDepend LINQ 代码查询 (CQLINQ)标记方法的属性,但这并不简单也不快速。我们计划改进 NDepend 代码模型中的属性支持,它已在NDepend 用户语音中提出。

因此,以下查询有效,但在大型代码库上可能需要几秒钟(这对于 NDepend 来说很慢,通常查询在几毫秒内执行):

let typesAttributes = Types.Where(t => t.IsAttributeClass)
from m in Methods
let mAttributes = typesAttributes.Where(t => m.HasAttribute(t)).ToArray()
where mAttributes .Length > 0
select new { m, mAttributes } 

下面的优化通常会使其运行速度快两倍。

let typesAttributes = Types.Where(t => t.IsAttributeClass)
from m in Types.UsingAny(typesAttributes).ChildMethods()
let mAttributes = typesAttributes.Where(t => m.HasAttribute(t)).ToArray()
where mAttributes .Length > 0
select new { m, mAttributes } 
于 2015-07-13T10:38:10.270 回答