2009-09-22 96 views
2

NDepend的類瀏覽器似乎沒有顯示繼承方法的選項。使用NDepend繼承的方法依賴關係

我們有這樣一個場景,我們有成千上萬來自RootModel下降,例如單根模式對象。只有RootModel定義保存()。如何查詢所有SampleModel(:RootModel)調用保存()

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

...被拒絕:不是有效的組件,命名空間,典型值,方法或字段名稱

這似乎是最好的近似,但並不確切:

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

這似乎是一個相當沉重的限制,不是嗎?什麼是解決方法?

回答

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 } 
+0

嗨,帕特里克;你是否建議靜態分析本身不能分析繼承的方法,或者它只是不被NDepend實現?它肯定是後者:反射器等各種工具通過靜態分析來枚舉類瀏覽器中的繼承成員。第二個查詢至多是一個估計;這不是人們希望的確切答案。我發現你們對NDepend的社區反饋非常開放,我希望這個人能夠列出名單;在我看來,這是OOP中非常常見的情況。 – Nariman 2009-09-23 13:43:20