196の日記

完全に開発メモと雑談、その他忘れそうな計算式などを書き溜める場所になっています!

C# Dictionaryにジェネリックをもつクラスを保持させたい

タイトルの日本語があっているかは微妙ですが、以下のようなことをやりたかった。

Dictionary<T,Hoge<T>> dict = new Dictionary<T,Hoge<T>>();

class Hoge<T> where T : 何か{
    //処理
}
Tに共通のインターフェースを継承させる

例えば、baseTというインターフェースをTに入るものが全て継承することにすれば、DictionaryのHogeHogeと書くことが可能になる。

object型を指定する

baseTを継承したところで、取り出す際には結局キャストをして上げなければならない。なら、わざわざインターフェースを継承させる手間を増やす必要もない。(すでに同じものを継承しているなら別) objectは全てのクラスなどの元となっているため、Dictionaryとした上で、取り出す際にキャストをしてあげるという手段もある。

object (C# リファレンス)

Dictionary<Type,object> dict = new Dictionary<Type,object>();

//入れる時
dict.add(typeof(T),hoge);

//出すとき
var hoge = (Hoge<T>)dict[typeof(T)];


ちなみに、typeofはリフレクションという割と処理が重い操作らしいので、多用しないようにすること。
初めて見たときにわかりやすいサイトさんがあったのでそちらも参考にしてください。
リフレクションを利用して文字列からクラス操作 - (void*)Pないと