C#/IDisposableへのwrapping のバックアップソース(No.1)

更新

[[公開メモ]]

* 必ず後処理の必要なクラスが IDisposable を実装していない?! [#ke4bae90]

やまねこ@楢ノ木技研 さんからのお題で、表記のような状況を解決する方法を考えてみました。

* IDisposable に wrap するためのライブラリ [#bd853fd5]

こんなのが思い浮かびました。

どうでしょうね。

 LANGUAGE:C#
 // Dispose 時に Close() したいのに IDisposable を継承してないクラスがいくつかある
 class ToBeClosed1
 {
     public void Close()
     {
         MessageBox.Show("Closed!");
     }
 }

 class ToBeClosed2
 {
     public void Close()
     {
         MessageBox.Show("Closed!");
     }
 }

 // using を使えるようにする wrapper
 class DisposableWrapper: IDisposable
 {
     Action action;
     protected DisposableWrapper(Action action)
     {
         this.action = action;
     }
     public void Dispose()
     {
         action.Invoke();
     }
     public implicit operator DisposableWrapper(ToBeClosed1 tbc1)
     {
         return new DisposableWrapper(() => tbc1.Close());
     }
     public implicit operator DisposableWrapper(ToBeClosed2 tbc2)
     {
         return new DisposableWrapper(() => tbc2.Close());
     }
 }

 // こうやって使う?
 private void button1_Click(object sender, EventArgs e)
 {
     using ((DisposableWrapper)new ToBeClosed1())
     {
     }

     using ((DisposableWrapper)new ToBeClosed2())
     {
     }
 }

* コメント [#q810f856]

#article_kcaptcha

Counter: 5886 (from 2010/06/03), today: 1, yesterday: 1