如何查找实现IDisposable的所有类?

我正在开发一个大型项目,我的任务之一是消除可能的内存泄漏。 在我的代码中,我注意到几个IDisposable项目没有被处理,并已修复。 但是,这引出了一个更基本的问题,如何找到我的项目中使用 IDisposable的所有类? (不是自定义创建的类,而是已使用的标准库类)。
我已经找到了一个实现IDisposable的不太明显的类(DataTable实现了MarshalByValueComponent,它inheritance了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;