【问题标题】:Inherited method dependencies using NDepend使用 NDepend 继承方法依赖项
【发布时间】:2023-03-05 10:47:01
【问题描述】:

NDepend 的类浏览器似乎没有显示继承方法的选项。

例如,我们有一个场景,我们有成千上万个从 RootModel 继承的单根 Model 对象。只有 RootModel 定义了 Save()。如何形成查询以查找 SampleModel (:RootModel) 调用 Save() 的所有实例?

SELECT METHODS WHERE IsUsing "SampleModel.Save()" ORDER BY DepthOfIsUsing

...被拒绝:不是有效的程序集、命名空间、类型、方法或字段名称

这似乎是最好的近似值,但并不准确:

SELECT METHODS WHERE IsUsing "SampleModel" AND IsUsing "RootModel.Save()" ORDER BY DepthOfIsUsing

这似乎是一个非常严重的限制,不是吗?解决方法是什么?

【问题讨论】:

    标签: ndepend


    【解决方案1】:

    从 NDepend 的静态角度来看,SampleModel 类没有声明 Save() 方法。这就是第一个查询无法编译的原因。

    在您的情况下,第二个查询确实是一件好事。为了正确,您可以使用Code Query on LINQ (CQLinq capabilities) 并以这种方式重写:

    from m in Application.Types.Where(t => t.DeriveFrom("MyNamespace.RootModel"))
             .ChildMethods()
    where m.IsUsing("MyNamespace.RootModel.Save()")
    select new { m, m.ParentType }
    

    【讨论】:

    • 嗨帕特里克;您是否建议仅静态分析不能分析继承的方法,或者它根本不是由 NDepend 实现的?当然是后者:反射器等各种工具通过静态分析枚举类浏览器中的继承成员。第二个查询充其量只是一个估计;这不是人们希望得到的确切答案。我看到你们对 NDepend 的社区反馈非常开放,我希望这个能进入列表;在我看来,这是 OOP 中非常常见的场景。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    • 2016-06-10
    • 1970-01-01
    • 2022-12-22
    • 1970-01-01
    • 2021-02-12
    • 2019-12-19
    相关资源
    最近更新 更多