1

我们如何通过函数重载方法传递不同类的不同对象?

示例代码:

static public void SerializeToXML(Movie movie)
{
    XmlSerializer serializer = new XmlSerializer(typeof(Movie));
    TextWriter textWriter = new StreamWriter(@"C:\movie.xml");
    serializer.Serialize(textWriter, movie);
    textWriter.Close();
}

当我使用此代码时:

static public void SerializeToXML(FbTextView p, FbTextField q)
{
    try
    {
        XmlSerializer textviewserilizer = new XmlSerializer(typeof(FbTextView));
        XmlSerializer textfieldserilizer = new XmlSerializer(typeof(FbTextField));

        TextWriter textWriter = new StreamWriter(@"D:\movie.xml");
        textviewserilizer.Serialize(textWriter, p);
        textfieldserilizer.Serialize(textWriter, q);
        textWriter.Close();
    }
    catch (Exception ex)
    {
        while (ex != null)
        {
            Trace.WriteLine(ex.Message);
            ex = ex.InnerException;
            MessageBox.Show(ex.Message);
        }
        throw;
    }
}

它的输出 xml 显示一些结果,即:

XML Parsing Error: junk after document element 
Location: file:///D:/movie.xml
Line Number 6, Column 14:</FbTextView><?xml version="1.0" encoding="utf-8"?>
                         -------------^ 
4

2 回答 2

6

你可以这样写generics

public static void SerializeToXml<T>(this T objectToSerialize, string fileName)
{
    XmlSerializer serializer = new XmlSerializer(objectToSerialize.GetType());
    using (TextWriter textWriter = new StreamWriter(fileName))
    {
        serializer.Serialize(textWriter, objectToSerialize);
    }
}
  • 泛型一开始可能有点令人困惑,但绝对值得学习。简而言之,现在您的方法接受任何类型。
  • 接受每种类型可能过于自由,然后您可以constrain只接受某些类型。
  • 将文件名作为参数传递给您的方法似乎是个好主意,否则您只能使用该方法写入一个文件(名称)。
  • 您还可以阅读有关using statement
  • extension method正如 LB 建议的那样,您可以通过在第一个参数之前添加 this 关键字来将您的方法变成一个。
  • 如果要将其实现为扩展方法,则方法和类必须是静态的。

如果您将 SerializeToXml 方法作为扩展方法,您可以通过以下两种方式之一调用它,结果将是相同的:

movie.SerializeToXml(@"C:\movie.xml");

SerializeToXml(movie, @"C:\movie.xml");
于 2012-11-02T23:00:08.317 回答
3

这里可以使用扩展方法

var xml = movie.SerializeToXML();

public static class SOExtensions
{
    public static string SerializeToXML<T>(this T obj)  where T : new()
    {
        StringWriter s = new StringWriter();
        XmlSerializer serializer = new XmlSerializer(typeof(T));
        serializer.Serialize(s, obj);
        return s.ToString();
    }
}

对于@ JohnSaunders的评论:“-1 直到您将该 StringWriter 放入 using 块”

“StringWriter 类” 实现一个 TextWriter 用于将信息写入字符串。信息存储在底层StringBuilder中。 http://msdn.microsoft.com/en-us/library/system.io.stringwriter.aspx

这里是 StringWriter 及其基类处理的代码。

//StringWriter
protected override void Dispose(bool disposing)
{
    this._isOpen = false;
    base.Dispose(disposing);
}

//TextWriter
protected virtual void Dispose(bool disposing)
{
}
于 2012-11-02T23:01:21.800 回答