Я писал некоторые пользовательские элементы управления WinForm, которые выполняют довольно много рисования и, следовательно, имеют тенденцию иметь много одноразовых графических полей, лежащих вокруг (кисти, ручки, растровые изображения и т. Д.), И в результате мои элементы управленияМетод Dispose () должен вызывать Dispose для каждого из них.
Я обеспокоен тем, что я (или будущий сопровождающий) мог легко пропустить поле, которое необходимо удалить, либо забыв удалить его, либо непонимая, что он реализует IDisposable.Таким образом, я написал очень простой метод расширения для Object, который находит все поля IDisposable и удаляет их:
static public void DisposeAll(this Object obj)
{
var disposable = obj.GetType()
.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance)
.Select(fi => fi.GetValue(obj))
.Where(o => o != null && o is IDisposable)
.Cast<IDisposable>();
foreach (var d in disposable) d.Dispose();
}
Мой вопрос заключается в том, разумно ли это делать.Я не могу думать, что это могло бы испортить, но тогда я не особенно знаком с внутренней работой WinForms, и это кажется чем-то вроде (путаница с отражением и утилизация), которая может вызвать раздражающие ошибки в будущем.