Вызвать Dispose у разных объектов

114
13 февраля 2019, 06:00

Есть коллекция, которая содержит экземпляры объектов. Некоторые из них реализуют интерфейс IDisposable.

Вопрос, как в этой коллекции можно вызвать метод Dispose, у объектов, реализующих интерфейс?

Пробую так, но не получается увидеть Dispose:

foreach (var actTab in ActTabs)
{
    if (actTab is IDisposable)
    {
       // Вызвать Dispose         
    }
}
Answer 1

Чтобы вызвать метод Dispose, нужно привести actTab к IDisposable

Как один из вариантов решения:

foreach (var actTab in ActTabs)
{
    var disposableActTab = actTab as IDisposable;
    if (disposableActTab != null)
    {
        disposableActTab.Dispose();
    }
}

Он же с использованием null propagation:

foreach (var actTab in ActTabs)
{
    var disposableActTab = actTab as IDisposable;
    disposableActTab?.Dispose();
}

Если хочется оставить проверку с помощью is, то можно так:

foreach (var actTab in ActTabs)
{
    if (actTab is IDisposable)
    {
        ((IDisposable)actTab).Dispose();
    }
}

или так:

foreach (var actTab in ActTabs)
{
    if (actTab is IDisposable)
    {
        (actTab as IDisposable).Dispose();
    }
}

Начиная с C# 7.0 этот вариант можно записать короче с помощью Type pattern, как показано в ответе @trydex

Answer 2

Вы все правильно делаете, только чтобы метод Dispose был доступен нужно вызывать его через приведение типов:

foreach (var actTab in ActTabs)
{
    if (actTab is IDisposable myObj)
    {
       myObj.Dispose();       
    }
}
Answer 3

Можно лаконично через LINQ вызвать:

list.OfType<IDisposable>().ToList().ForEach(x=>x.Dispose());
READ ALSO
Ошибка парсинга через AngleSharp ArgumentOutOfRangeException

Ошибка парсинга через AngleSharp ArgumentOutOfRangeException

По нажатию кнопки вызывается метод

129
C# Как перекодировать текст \uNNNNNN в кириллицу

C# Как перекодировать текст \uNNNNNN в кириллицу

Устал уже биться над проблемой, поиск в интернет не дал результатаИмеется Basic авторизация веб-апи

150
OrderBy не сортирует

OrderBy не сортирует

Есть следующий код

149
Как сделать авторизацию по имени в .net core 2.1?

Как сделать авторизацию по имени в .net core 2.1?

делаю чат и параллельно учуnet core 2

133