传递 class 作为类型

Passing a class as type

我正在尝试传入一个类型对象以传递给序列化程序。

internal void SerializeXML(Object ObjType, String XMLRoot, Object Output, String Filename)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(ObjType), new XmlRootAttribute(XMLRoot));

        StreamReader reader = new StreamReader(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(Filename));
        Output = (Type)serializer.Deserialize(reader);
        reader.Close();
    }

我想通过(Main.LanguageList.Language 是一个 class)来调用它:

SerializeXML(Main.LanguageList.Language, "Language", LanguageListFile, InternalLangListXML);

我得到 Object is a variable but is used as a type。

写一个泛型方法会更优雅:

internal void DeserializeXML<T>(String XMLRoot, T Output, String Filename)
{
    XmlSerializer serializer = new XmlSerializer(typeof(T), new XmlRootAttribute(XMLRoot));

    StreamReader reader = new StreamReader(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(Filename));
    Output = (T)serializer.Deserialize(reader);
    reader.Close();
}

并这样称呼它:

DeserializeXML<Main.LanguageList.Language>("Language", LanguageListFile, InternalLangListXML);

此外,建议将方法更改为 return 结果,而不是依赖输出参数:

internal T DeserializeXML<T>(String XMLRoot, String Filename)
{
    XmlSerializer serializer = new XmlSerializer(typeof(T), new XmlRootAttribute(XMLRoot));

    using (StreamReader reader = new StreamReader(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(Filename)))
    {
        return (T)serializer.Deserialize(reader);
    }
}

然后可以这样调用:

var result = DeserializeXML<Main.LanguageList.Language>("Language", InternalLangListXML);