Есть коллекция, которая содержит экземпляры объектов. Некоторые из них реализуют интерфейс IDisposable
.
Вопрос, как в этой коллекции можно вызвать метод Dispose
, у объектов, реализующих интерфейс?
Пробую так, но не получается увидеть Dispose
:
foreach (var actTab in ActTabs)
{
if (actTab is IDisposable)
{
// Вызвать Dispose
}
}
Чтобы вызвать метод 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
Вы все правильно делаете, только чтобы метод Dispose
был доступен нужно вызывать его через приведение типов:
foreach (var actTab in ActTabs)
{
if (actTab is IDisposable myObj)
{
myObj.Dispose();
}
}
Можно лаконично через LINQ вызвать:
list.OfType<IDisposable>().ToList().ForEach(x=>x.Dispose());
Устал уже биться над проблемой, поиск в интернет не дал результатаИмеется Basic авторизация веб-апи