2008年05月22日

ジェネリックなSingleton

   このエントリーをはてなブックマークに追加 Clip to Evernote
こんなクラスを書いてみた。

public sealed class Singleton<T> where T : class {
public static T Instance {
get { return singleton; }
}
static Singleton() {
Type t = typeof(T);
var obj = Activator.CreateInstance(t, true);
singleton = obj as T;
}
private static readonly T singleton = null;
}


このクラスを使えば、

Sample o = Singleton<Sample>.Instance;


なんていう書き方ができる。
そして、Sampleクラスのコンストラクタを privateにすれば、

Sample o = new Sample();


という書き方もできなくなる。
リフレクションを使っているはそのためだ。


この記事へのコメント
Activator.CreateInstance<T>() てのがありますよ。
Posted by NyaRuRu at 2008年05月23日 11:49
Hoge h = Activator.CreateInstance<Hoge>();

ってやってみましたが、
Hogeのコンストラクタをprivateにしたら、例外が発生しました (T T)。

ダメみたいです。
Posted by Gushwell at 2008年05月23日 19:15
なるほど.コンストラクタをprivateにするのがポイントなわけですね.
Posted by NyaRuRu at 2008年05月24日 01:09
はい、それじゃないと、Singletonじゃなくなっちゃいますからね。
Posted by Gushwell at 2008年05月24日 21:02
 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/51519040