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、特定のタイプだけを受け入れることができます。
  • メソッドに引数としてファイル名を渡すのは良い考えのようです。そうしないと、メソッドを使用して1つのファイル(名前)にしか書き込むことができません。
  • あなたはまたについて読むことができますusing statement
  • extension methodLBが示唆しているように、最初の引数の前にthisキーワードを追加することで、メソッドをに変えることができます。
  • 拡張メソッドとして実装する場合は、メソッドとクラスが静的である必要があります。

SerializeToXmlメソッドを拡張メソッドとして使用している場合は、次の2つの方法のいずれかで呼び出すことができ、結果は同じになります。

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のコメントの場合:「そのStringWriterをusingブロックに入れるまで-1」

「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 に答える