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

时间:2010-06-07 09:25:11

标签: c# visual-studio-2008 idisposable

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

5 个答案:

答案 0 :(得分:18)

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;

答案 1 :(得分:7)

使用FxCop测试您的项目。它可以捕获未放置IDisposable对象的所有位置。您可能需要做一些工作来禁用所有不相关的FxCop规则,只留下与IDisposable相关的规则。

例如,这是FxCop IDisposable规则之一:http://msdn.microsoft.com/en-us/library/ms182289%28VS.100%29.aspx

注意:您需要找到自己的.NET和第三方IDisposable对象,这些对象无法正确处理。

答案 2 :(得分:3)

您可以使用NDepend分析项目并查找实现IDisposable的所有类型。

这是结果的查询

SELECT TYPES WHERE Implement "System.IDisposable"

答案 3 :(得分:0)

我觉得下面的代码可能有用。如果从外部工具运行,则必须调整以加载正确的装配。

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

答案 4 :(得分:0)

尝试这个LINQ查询:

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