2009-03-31 8 views
0

Ich möchte Elemente in einer Combobox füllen, jeder von ihnen hat ein anderes Verhalten. Ja Ich weiß, ich könnte einfach 3 Klassen erstellen, die von einer Basisklasse stammen. Aber meine Frage ist irgendwie "gibt es einen anderen Weg" und "was ist möglich". In Java kann man "new MyClass() {public void overriddenmethod() {...}}" tun, aber in C# können wir nicht, können wir?C# 3.0: Füllen Sie Objekte mit unterschiedlichen Verhalten in Sammlungen

Jetzt verwende ich ein Lambda, um eine Methode im laufenden Betrieb zu definieren, aber das Problem ist, dass ich später die neue XxxFormatter() als Instanzvariable dieses Objekts will. Da die XxxFormatters keine gemeinsame Basisklasse teilen, kann ich sie nicht als einzelnes Feld in die SerializingHelper-Klasse einfügen.

Haben Sie irgendwelche Ideen?

public delegate void SerializingHandler(Stream s, object o); 

class SerializingHelper 
{ 
    public string Name { get; set; } 
    public SerializingHandler Serializer { get; set; } 
} 

comboFormat.Items.AddRange(new object[] 
{ 
      new SerializingHelper{ Name = "Binary", 
Serializer = (s,o)=>new BinaryFormatter().Serialize(s,o), 

      new SerializingHelper{ Name = "Soap", 
Serializer = (s,o)=>new SoapFormatter().Serialize(s,o), 

      new SerializingHelper{ Name = "Xml", 
Serializer = (s,o)=>new XmlSerializer(typeof(KontaktpartnerData), new Type[] 
{typeof(ArrayList), typeof(KontaktPartner)}).Serialize(s,o), } 

}); 
+0

Warum möchten Sie den Formatierer als Instanzvariable der Klasse? Was willst du erreichen, dass der Code, den du gegeben hast, nicht schon funktioniert? –

+0

Jedes Mal, wenn der Benutzer einen Formatierer aus der Combobox verwendet, wird ein neues Formatiererobjekt erstellt, das ich vermeiden möchte. Ich weiß, Leistung in diesem speziellen Szenario spielt keine Rolle. Wenn ich zusätzlich einen Deserializer unter Verwendung einer zusätzlichen Eigenschaft einfüge, wird die Formatierererzeugung dupliziert. – codymanix

Antwort

2

Wenn Sie nur eine neue Serializer Instanziieren Instanz jedes Mal verhindern möchten, können Sie diese außerhalb der Lambda-instanziiert:

var binaryFormatter = new BinaryFormatter(); 

comboFormat.Items.AddRange(new object[] 
{ 
    new SerializingHelper 
    { 
     Name = "Binary", 
     Serializer = binaryFormatter.Serialize 
    } 

    ... 
}); 

Wenn Sie wirklich die Formatierungs als speichern müssen Feld, könnten Sie so etwas tun:

delegate void SerializingHandler<TFormatter>(TFormatter formatter, 
              Stream stream, 
              object graph); 

interface ISerializingHelper 
{ 
    void Serialize(Stream stream, object graph); 
} 

class SerializingHelper<TFormatter> : ISerializingHelper 
{ 
    private readonly SerializingHandler<TFormatter> handler; 
    private readonly TFormatter formatter; 

    public SerializingHelper(SerializingHandler<TFormatter> handler, 
          TFormatter formatter) 
    { 
     this.handler = handler; 
     this.formatter = formatter; 
    } 

    public TFormatter Formatter 
    { 
     get { return this.formatter; } 
    } 

    public void Serialize(Stream stream, object graph) 
    { 
     this.handler(this.formatter, stream, graph); 
    } 
} 
Verwandte Themen