如何最好地表达此序列化/反序列化类型的扩展方法

Ben*_*enS 2 c# extension-methods serialization

我有以下两种扩展方法:

public static object DeserializeFromXmlFile(this Type type, string FileName)
{
        try
        {
            using (TextReader reader = new StreamReader(FileName))
            {
                XmlSerializer ser = new XmlSerializer(type);
                return ser.Deserialize(reader);
            }
        }
        catch (Exception ex)
        {
            return null;
        }
}

public static bool SerializeToXmlFile(this object obj, string FileName)
{
        try
        {
            using (TextWriter writer = new StreamWriter(FileName))
            {
                XmlSerializer ser = new XmlSerializer(obj.GetType());
                ser.Serialize(writer, obj);
            }
            return true;
        }
        catch (Exception ex)
        {
            return false;
        }
}
Run Code Online (Sandbox Code Playgroud)

然后是使用它们的代码:

SaveToFile(string LogFile, MyClass c)
{
    c.SerializeToXmlFile(LogFile);
}

MyClass LoadFromFile(string LogFile)
{
    return (MyClass)typeof(MyClass).(LogFile);
}
Run Code Online (Sandbox Code Playgroud)

我不喜欢如何LoadFromFile使用Deserialize方法,我可以使它像Serialize用法(in SaveToFile())一样好吗?

D S*_*ley 6

我不确定扩展方法Type是什么方式去这里.你并没有真正"扩展"这门Type课程.你可以改为通用:

public static T DeserializeFromXmlFile<T>(string FileName) where T:class
{
    try
    {
        using (TextReader reader = new StreamReader(FileName))
        {
            XmlSerializer ser = new XmlSerializer(typeof(T));
            return ser.Deserialize(reader) as T;
        }
    }
    catch (Exception ex)
    {
        return default(T); // is this really the right approach?  Just ignore the error and silently return null?
    }
}
Run Code Online (Sandbox Code Playgroud)

然后使用是

MyClass LoadFromFile(string LogFile)
{
    return DeserializeFromXmlFile<MyClass>.(LogFile);

    // or return {classname}.DeserializeFromXmlFile<MyClass>.(LogFile);
    // if the static method is defined in a different class.
}
Run Code Online (Sandbox Code Playgroud)

请注意,您必须<MyClass>在调用中包含,因为编译器可以;通过使用返回类型来推断泛型类型参数.