ジェネリックス
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はなくなりました。