NDepend:列出附加在方法上的属性,这是可能的吗?

3
我想使用NDepend及其基于Linq的查询语言来生成有关代码当前状态的报告。我希望能够用预定义的“标签”对一些方法和类进行标记,例如用标签“Database”标记的方法包含数据库特定代码,用标签“Algorithm_X”标记的方法包含与算法“X”相关的特定逻辑。我们认为这样的标记过程将导致更直接的文档生成过程。
我想知道NDepend是否提供了促进此过程的机制。我考虑使用C#属性来生成这样的自定义标记,然后使用相应的属性将方法标记到“tagging”。我非常了解CQLinq的“.HasAttribute”方法并积极使用它。但是,这个标记过程需要一种方法来列举附加到方法的所有属性,直到现在我都没有使用NDepend实现它。
我的问题是:有没有办法在NDepend中实现这一点(列出方法的所有属性)?如果没有,是否有另一种方式在NDepend中促进这样的标记过程?我可以通过编写自定义C#代码使用Reflections来实现这一点,但我想确保在这个阶段我已经尝试了NDepend所提供的所有选项。
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 } 

感谢您的快速回答。更进一步地说,是否有可能获取属性参数呢?例如,如果我在我的类上定义了一个属性 [TagAttribute("Class Info")] class MyClass { },是否有可能使用 CqLinq 以某种方式获取字符串“Class Info”呢? - Ufuk Can Bicici
目前还不可能实现,这是NDepend用户反馈中的链接,请不要犹豫,为其投票并发表评论。http://ndepend.uservoice.com/forums/226344-ndepend-user-voice/suggestions/5544407-being-able-to-read-attribute-property-values - Patrick from NDepend team

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接