我是NDepend的新手,只是让我的脚湿透了。我可以使用以下简单查询创建类依赖图:
from t in Application.Types
// remove compiler generated classes
where !t.FullName.Contains(">")
// sort by dependency count
orderby t.TypesUsed.Count()
select new { t, t.TypesUsed }
我正在尝试构建一个有序的类列表,这样列表中的第一项不具有系统类型以外的依赖项。当我们浏览列表时,每个类型应该只有在列表中出现的依赖项。我意识到在具有周期性依赖性的情况下这是不可能的,但我想至少让它们进入一个更正确的顺序,而不仅仅是通过依赖计数排序。
答案 0 :(得分:1)
这是一个棘手的但可行的。此CQLinq代码查询使用了NDepend.API方法FillIterative()的魔力。
// The call FillIterative() will fill hashSet with types already processed
let hashSet = new HashSet<IType>()
let fillHashSetWithTypesFunc = new Func<IEnumerable<IType>, bool>(types => types.All(t => hashSet.Add(t)))
let metric = ThirdParty.Types.FillIterative(
types =>
// Use a ternary operator to invoke fillHashSetWithTypesFunc() that always return true,
fillHashSetWithTypesFunc(types) ?
// Select t when hashSet contains all t.TypesUsed
Application.Types.Where(t => t.TypesUsed.Intersect(hashSet).Count() == t.TypesUsed.Count()) :
// new IType[0] is never invoqued coz fillHashSetWithTypesFunc() always returns true
new IType[0])
from val in metric
where val.Value > 0 // Don't show third-party types
orderby val.Value ascending
select new { val.CodeElement,
(val.CodeElement as IType).Level,
val.Value,
(val.CodeElement as IType).TypesUsed }
循环中涉及的类型不匹配。
结果为匹配的每种类型分配一个值:
有趣的是,指标IType.Level可以准确地提供该指标并回答您的问题。但是用代码查询重新编写它会更有趣。可以使用名称空间(也具有“级别”度量标准),程序集和方法来完成此操作。