Подтвердить что ты не робот

Как найти все классы, реализующие IDisposable?

Я работаю над большим проектом, и одна из моих задач - удалить возможные утечки памяти. В моем коде я заметил, что некоторые объекты IDisposable не удаляются и исправили это. Однако это приводит меня к более основному вопросу: как мне найти все классы , используемые в моем проекте, которые реализуют IDisposable? (Не созданные пользователем классы, но стандартные классы библиотеки, которые были использованы).
Я уже нашел один менее очевидный класс, который реализует IDisposable (DataTable реализует MarshalByValueComponent, который наследует IDisposable). Прямо сейчас, я вручную проверяю любые подозрительные классы с помощью MSDN, но нет ли способа, с помощью которого я могу автоматизировать этот процесс?

4b9b3361

Ответ 1

Reflector может показать вам, какие классы реализуют IDisposable: просто найдите интерфейс IDisposable в Reflector и разверните "Производные типы" node

Другим вариантом, из кода, является проверка всех загруженных сборок для типов, реализующих IDisposable:

var disposableTypes =
    from a in AppDomain.CurrentDomain.GetAssemblies()
    from t in a.GetTypes()
    where typeof(IDisposable).IsAssignableFrom(t)
    select t;

Ответ 2

Протестируйте свой проект с помощью 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"

Ответ 4

Я думаю, что что-то вроде кода ниже может работать. Он должен быть настроен для загрузки правильной сборки, если вы используете внешний инструмент.

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

Ответ 5

попробуйте этот запрос LINQ:

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