我一直在寫一些自定義的WinForm控件,它會執行相當多的繪圖工作,因此往往會有很多一次性的基於圖形的字段(畫筆,鋼筆,位圖等),因此我的控件的Dispose ()方法必須在每個方法上調用Dispose。自動處置擴展方法是否合理?
我擔心我(或未來的維護者)可能很容易錯過需要處理的字段,可以通過忘記Dispose或未意識到它實現了IDisposable。因此我寫了一篇關於對象的一個非常簡單的擴展方法,找到所有了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的內部工作並不是特別熟悉,這看起來就像是一種可能會引起惱人的錯誤的東西(與反射和處置有關)。
您可以使用'.OfType()'替換'Where'和'Cast'調用。 –
SLaks
2010-10-08 13:30:23
謝謝。 OfType擴展是否也檢查空值?我會假設沒有。 – Gibsnag 2010-10-08 13:44:12