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

18

我正在处理一个大型项目,其中一个任务是消除可能的内存泄漏。在我的代码中,我注意到了几个未被处置的IDisposable项目,并进行了修复。然而,这引导我提出了一个更基本的问题,如何找到在我的项目中使用了IDisposable实现的所有类?(不是自定义创建的类,而是已经使用的标准库类)。
我已经发现了一个不太明显的实现IDisposable的类(DataTable实现MarshalByValueComponent,它继承了IDisposable)。现在,我通过使用MSDN手动检查任何怀疑的类,但是难道没有一种可以自动化此过程的方法吗?

5个回答

19

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;

以上这段代码会扫描所有已加载的程序集(而不仅仅是执行程序集),并按命名空间对所有可处理类型进行排序,因此非常容易检查是否遗漏了任何可处理类型。非常感谢 :) - apoorv020

8
使用FxCop测试您的项目。它可以捕获未处理IDisposable对象的所有位置。您可能需要做一些工作来禁用所有不相关的FxCop规则,只留下与IDisposable相关的规则。
例如,这是FxCop中的一个IDisposable规则:http://msdn.microsoft.com/en-us/library/ms182289%28VS.100%29.aspx 注意:您需要查找自己的、.NET和第三方IDisposable对象,以确保它们被正确处理。

3
你可以使用 NDepend 来分析你的项目并找到所有实现 IDisposable 接口的类型。
以下是结果的 CQL 查询语句。
SELECT TYPES WHERE Implement "System.IDisposable"

0

我认为下面这段代码可能会起作用。但是,如果从外部工具运行,则必须调整以加载正确的程序集。

Assembly asm = Assembly.GetExecutingAssembly();
foreach (Type type in asm.GetTypes())
{
 if(type.GetInterface(typeof(IDisposable).FullName)  != null)
 {
  // Store the list somewhere
 }
}

这不完全是我想要的。 这段代码循环遍历当前程序集中<i>定义</i>的类型,而我想在当前程序集中运行它以覆盖正在<i>使用</i>的类型。 <br/>我可以轻松检查我的项目中是否有一个类实现了IDisposable,但我想检查我正在使用的标准库类是否实现了IDisposable。 - apoorv020
@apoorv020:我认为应该能够在 .Net 框架程序集上运行上述代码(任何被你项目引用的程序集),然后你可以保存实现了 IDisposable 的所有内容,最后只需在源代码中查找该列表中的任何内容即可。 - Hans Olsson
"Thomas Levesque" 的代码正是如此。虽然谢谢你的回答,它给了我正确的方向。 - apoorv020

0

尝试这个LINQ查询:

var allIdisposibles = from Type t in Assembly.GetExecutingAssembly().GetTypes()
                      where t.GetInterface(typeof(IDisposable).FullName) != null && t.IsClass
                      select t;

2
不要认为会起作用,MSDN 的注释是:IsSubclassOf 方法不能用于确定一个接口是否派生自另一个接口,或者一个类是否实现了一个接口 - Hans Olsson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接