【发布时间】:2011-04-22 21:38:24
【问题描述】:
我一直在编写一些自定义 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 的内部工作并不是特别熟悉,这似乎是一种可能会导致恼人的错误的事情(弄乱反射和处置)。
【问题讨论】:
-
您可以将
Where和Cast调用替换为.OfType<IDisposable>()。 -
谢谢。 OfType 扩展是否也检查空值?我想不会。
标签: c# .net extension-methods dispose