NDepend:列出附加到方法上的属性,是否可能

本文关键字:属性 是否 方法 NDepend | 更新日期: 2023-09-27 18:02:26

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

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

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

NDepend:列出附加到方法上的属性,是否可能

你实际上可以用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 }