У меня есть Listbox, у которого есть 3 элемента, в которые можно выбрать только один элемент за раз. Свойства этих предметов доступны из разных классов - Alto, Zen, Esteem. Мне нужно использовать только 1 класс за раз. Я храню эти классы в массиве списка. Как я могу избавиться от моих желаемых классов (по моей логике)?
Список массива классов
List<object> lst = new List<object>();
Добавить каждый объект класса в список
Alto objAlto = new Alto();
Zen objZen = new Zen();
Esteem objEsteem = new Esteem();
lst.Add(objAlto);
lst.Add(objZen);
lst.Add(objEsteem);
Моя логика Dispose
Теперь мой вопрос: как я могу распоряжаться объектами? Почему я не могу получить ".Dispose"? Мне не хватает какого-либо неявного преобразования, чтобы воспользоваться этой функцией?
Чтобы добавить к ответу D Stanleys, как насчет этого:
foreach(var o in lst.OfType<IDisposable>())
{
o.Dispose();
}
Почему я не могу получить ".Dispose"?
Список, содержащийся в списке, представляет собой список типов и Dispose
- это метод интерфейса IDisposable
. Если ваш список имеет тип IDisposable
(или некоторый тип, который реализует IDisposable
), вы можете напрямую вызвать Dispose
.
Мне не хватает какого-либо неявного преобразования, чтобы воспользоваться этой функцией?
Там не подразумевается преобразование, но если объекты реализуют IDisposable
вы можете явно их использовать:
foreach(object o in lst)
{
if(o is IDisposable)
((IDisposable)o).Dispose();
}
Однако есть пара дизайнерских странностей, которые я вижу:
Object
), было бы лучше использовать список более конкретного типа.IDisposable
..Dispose
не удаляет объекты из памяти - это делает сборщик мусора, и только когда ничто не содержит ссылки на него - поэтому, чтобы сборщик мусора очистил объекты, вам нужно будет удалить их из списка.
IDisposable
на ваших классах и предоставьте методDispose
В настоящее время у вас естьList<object>
, вам нуженList<YourClass>
с реализованнымIDisposable
. Еще одна вещь, вы действительно уверены, что вам нужноDispose
? Вы обрабатываете какие-либо неуправляемые ресурсы.