Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何找到实现IDisposable的所有类?_C#_Visual Studio 2008_Idisposable - Fatal编程技术网

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

C# 如何找到实现IDisposable的所有类?,c#,visual-studio-2008,idisposable,C#,Visual Studio 2008,Idisposable,我正在从事一个大型项目,我的任务之一是消除可能的内存泄漏。在我的代码中,我注意到几个IDisposable项目没有被处理,并且已经修复了这个问题。然而,这就引出了一个更基本的问题,如何找到我的项目中使用的所有实现IDisposable的类?(不是自定义创建的类,而是已使用的标准库类)。 我已经找到了一个实现IDisposable的不太明显的类(DataTable实现MarshallByValueComponent,它继承IDisposable)。现在,我正在使用MSDN手动检查任何可疑的类,但是

我正在从事一个大型项目,我的任务之一是消除可能的内存泄漏。在我的代码中,我注意到几个IDisposable项目没有被处理,并且已经修复了这个问题。然而,这就引出了一个更基本的问题,如何找到我的项目中使用的所有实现IDisposable的类?(不是自定义创建的类,而是已使用的标准库类)。

我已经找到了一个实现IDisposable的不太明显的类(DataTable实现MarshallByValueComponent,它继承IDisposable)。现在,我正在使用MSDN手动检查任何可疑的类,但是否有某种方法可以使此过程自动化?

我认为下面的代码可能会起作用。如果从外部工具运行,则必须对其进行调整以加载正确的组件

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;

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

例如,这是FxCop IDisposable规则之一:

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

可以显示哪些类实现了
IDisposable
:只需在Reflector中找到
IDisposable
接口,然后展开“派生类型”节点

代码中的另一个选项是扫描所有加载的程序集,查找实现
IDisposable
的类型:

var disposableTypes =
    from a in AppDomain.CurrentDomain.GetAssemblies()
    from t in a.GetTypes()
    where typeof(IDisposable).IsAssignableFrom(t)
    select t;
您可以使用来分析项目并查找实现IDisposable的所有类型

下面是对结果的cql查询

SELECT TYPES WHERE Implement "System.IDisposable"

MSDN的评论:IsSubclassOf方法不能用于确定接口是否派生自另一个接口,或者类是否实现了一个接口。这并不是我想要的。这段代码在当前程序集中定义的类型上循环,而我想在当前程序集中使用的类型上运行它
我可以很容易地检查在我的项目inplements中定义的类之一是否可以IDisposable,但是我想检查我正在使用的标准库类是否实现IDisposable。@apoorv020:也应该能够在.Net framework程序集(项目引用的任何程序集)上运行上述代码,然后你可以保存一个实现IDisposable的所有东西的列表,然后在源代码中搜索列表中的任何东西?Thomas Levesque的代码就是这样做的。不过,感谢您的回答,它为我指明了正确的方向。上面的这段代码扫描了所有加载的程序集(而不仅仅是执行的程序集),并给出了按名称空间排序的所有一次性类型,因此很容易检查您遗漏的任何一次性类型。非常感谢:)