制御の逆転とIDisposable

IDisposableを実装する(かもしれない)オブジェクトの後始末は簡単だ。IDisposableを実装していれば、メソッドDispose()を呼べばよい。

if ( component is IDisposable )
{
    (component as IDisposable).Dispose();
}

ならば、一度DisposeされたIDisposableオブジェクトが「Dispose済み」であることをテストすることはできるのであろうか。
否。ControlクラスのようにIsDisposedプロパティかメソッドがIDisposableに定義されていれば良かったのだが、残念ながら無い。現状ではObjectDisposedExceptionがスローされたか否かで判断するしかないのである。(これが理由で、前からIDisposableは中途半端だと思っていたんだけど、私だけだろうか。)
回りくどくなってしまったが、なにがしたいかというと、例えばDIコンテナで生成、管理しているシングルトンなオブジェクトが(singletonってのがポイント)、クライアント側で(誤用を含めて)Disposeされてしまったオブジェクトの復旧をどうするか、ということが、ふと気になったからである。
例えば、「FormクラスでShowDialog使った後はDispose必須だよなぁ」とか思ってるプログラマが、DIコンテナがデプロイしたSingletonなFormのインスタンスを、無意識にDisposeしちゃうようなケース。

Form1 form1 = DIContainer.GetComponent();//実はsingleton
using (form1)
{
    form1.ShowDialog();
}

上に書いたとおり、現状ではIDisposableインタフェースは自身がDisposeされたか否かは判らないため、一度Disposeされてしまったオブジェクトは、その後DIコンテナからは二度と使えない屑オブジェクトとして永久に提供されることになるので、一度Disposeした後はFormを使う度に例外がスローされる。こいつを回収、復旧しようにも、ObjectDisposedExceptionが投げられるタイミングは、クラスによって違うし、困ったもんだ。
むろん、IDisposableインタフェースは「(アンマネジリソースを)Disposeするのは使う側の責任よ」というポリシで実装されているのだろうし、本末転倒だろうということは理解している。