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