たぷつきません

おなかがでてきた。もうたぷついてるやん。

ジェネリックス

 Javaでいうところの、Class 相当のものが欲しい。制約条件をこんな感じで拡張してもらいたい。

    T loadXml<T, TT>(TT type)
        where TT: typeof(T)
追記

 ↑は全然的外れで、制約条件にするどころかそもそもTTなんて引数が要らないことが分かりました。理解に至ったのは、System.Activator.CreateInstance()がキッカケです。型引数しか渡してないのに何故インスタンス生成できるの!?ということは!…と。
型引数が実引数並みのパワーを持つC#ではJavaでの小細工など不要だったということです。そういうわけで7/6に書いたloadXmlメソッドは以下のように書けます。

        private T loadXml<T>()
        {
            XmlSerializerFactory factory = new XmlSerializerFactory();
            XmlSerializer serializer = factory.CreateSerializer(typeof(T));
            T result = default(T);
            string fileName = System.Environment.GetFolderPath(Environment.SpecialFolder.Personal);
            using (FileStream stream = File.Open(fileName + "\\SerializeTest_" + typeof(T).FullName + ".xml", FileMode.Open))
            {
                result = (T)serializer.Deserialize(stream);
                stream.Close();
            }
            return result;
        }

 「where T: class」が必要なのは非ヌル型(struct)が渡されると null代入はできないためです(コンパイラが教えてくれます)。*1
 この次のトピック([C#] XMLのネストでけた)で書いている呼び出しは、以下のように置き換えられます。超スッキリ!

ClassAttributes maps = loadXml(typeof(ClassAttributes)) as ClassAttributes;
   ↓
ClassAttributes maps = loadXml<ClassAttributes>();

 コメントをいただいたNyaRuRuさんに感謝です。ありがとうございました。

*1:NyaRuRuさんのコメントに従い書き換えたのでwhere T: classはなくなりました。