[英]How to find all Classes implementing IDisposable?
我正在開發一個大型項目,我的任務之一是消除可能的內存泄漏。 在我的代碼中,我注意到幾個IDisposable項目沒有被處理,並已修復。 in my project that implement IDisposable? 但是,這引出了一個更基本的問題,如何找到我的項目中 IDisposable的所有類? (不是自定義創建的類,而是已使用的標准庫類)。
我已經找到了一個實現IDisposable的不太明顯的類(DataTable實現了MarshalByValueComponent,它繼承了IDisposable)。 現在,我通過使用MSDN手動檢查任何可疑的類,但是我沒有某種方法可以自動執行此過程?
Reflector可以顯示哪些類實現IDisposable
:只需在Reflector中找到IDisposable
接口,然后展開“派生類型”節點
代碼中的另一個選項是掃描所有已加載的程序集以查找實現IDisposable
類型:
var disposableTypes =
from a in AppDomain.CurrentDomain.GetAssemblies()
from t in a.GetTypes()
where typeof(IDisposable).IsAssignableFrom(t)
select t;
使用FxCop測試您的項目。 它可以捕獲未放置IDisposable對象的所有位置。 您可能需要做一些工作來禁用所有不相關的FxCop規則,只留下與IDisposable相關的規則。
例如,這是FxCop IDisposable規則之一: http : //msdn.microsoft.com/en-us/library/ms182289%28VS.100%29.aspx
注意:您需要找到自己的.NET和第三方IDisposable對象,這些對象未正確處理。
您可以使用NDepend來分析項目並查找實現IDisposable的所有類型。
這是結果的cql查詢
SELECT TYPES WHERE Implement "System.IDisposable"
我認為類似下面的代碼可能會起作用。 如果從外部工具運行,則必須調整以加載正確的組件。
Assembly asm = Assembly.GetExecutingAssembly();
foreach (Type type in asm.GetTypes())
{
if(type.GetInterface(typeof(IDisposable).FullName) != null)
{
// Store the list somewhere
}
}
試試這個LINQ查詢:
var allIdisposibles = from Type t in Assembly.GetExecutingAssembly().GetTypes()
where t.GetInterface(typeof(IDisposable).FullName) != null && t.IsClass
select t;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.