类型参数

时间:2016-10-18 08:03:08

标签: c# xml generics serialization

我只是想知道使用带有类型Type的参数的函数(和更多参数)和只想要angle bracket中的类型的泛型函数有什么区别?

Idea behinde:我想编写一个将ma文件系统上的类型保存为XML文件的函数。由于XmlSerializer需要具有要序列化的对象类型,我想知道:什么更好?

private bool SerializeIt(object o, Type t, string filePath)
{
    bool result = false;
    try
    {
        if (File.Exists(filePath))
            File.Delete(filePath);

        XmlSerializer serializer = new XmlSerializer(t);
        using (FileStream fs = new FileStream(filePath, FileMode.CreateNew, FileAccess.Write))
        {
            serializer.Serialize(fs, o);
        }
        result = true;
    }
    catch (Exception ex)
    {
        result = false;
        Debug.WriteLine(ex);
    }

    return result;
}

private bool SerializeIt<T>(T o, string filePath)
{
    bool result = false;
    try
    {
        if (File.Exists(filePath))
            File.Delete(filePath);

        XmlSerializer serializer = new XmlSerializer(o.GetType());
        using (FileStream fs = new FileStream(filePath, FileMode.CreateNew, FileAccess.Write))
        {
            serializer.Serialize(fs, o);
        }
    }
    catch (Exception ex)
    {
        result = false;
        Debug.WriteLine(ex);
    }

    return result;
}

3 个答案:

答案 0 :(得分:2)

您的第一种方法仅适用于SomeData1类型,因为这是您指定的类型。另一种方法适用于通过T传递的任何类型。

您可以使用o.GetType()代替typeof(SomeData1)来解决上述问题。尽管如此,第二种方法使您有机会使用基类作为序列化基础,这将清除派生类中的所有属性。

答案 1 :(得分:1)

在运行时评估函数private bool SerializeIt(object o, Type t, string filePath)。 在编译时评估函数private bool SerializeIt<T>(T o, string filePath的位置。那就是在IL代码中插入指定的类型。

答案 2 :(得分:1)

有很多不同之处。首先,您可以为通用参数创建约束,例如:

private bool SerializeIt<T>(T o, string filePath) where T: ISomething

其次 - 泛型类型的自由类型推断。

private bool SerializeIt<T>(T o, string filePath)

Something something = new Something();
o.SerializeIt(something, ""); // dont need to pass type (can infer from first argument).

第三 - 你在具体的强类型上工作,例如:

private bool SerializeIt<T>(T o, string filePath)

通常它使界面更简洁,更清洁。你不必使用松散类型的对象。