Es geht um eine generische Undo-Funktion.
Rund um einen generischen Stack baue ich einen MementoStack (Name vom
"Memento-Pattern")
Das ist nicht die endgültige Implementierung, mehr ein "proof of
concept"...
Zur Frage: Das klappt alles wunderbar, nur erhalte ich beim Undo()
eine neue Instanz meines Objekts. Das würde in der gegebenen Anwendung
aber Nebenwirkungen haben. Gibt es einen generischen Weg, den Status
eines Objekts zu sichern und später in eine _vorhandene_ Instanz
zurück zu schreiben? Sonst fällt mir nur Reflection ein...
TIA
Gottfried
############################################################
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
public class MementoStack<T> {
protected Stack<T> stack=new Stack<T>();
public void SaveState(T item) {
stack.Push(Serialize(item));
}
public T Undo() {
return stack.Pop();
}
public T LookUpLast() {
return stack.Peek();
}
private Func<T,T> Serialize = x => {
var bf = new BinaryFormatter();
T objectCopy;
using (var ms = new MemoryStream()) {
bf.Serialize(ms, x);
ms.Position = 0;
objectCopy = (T)bf.Deserialize(ms);
}
return objectCopy;
};
}
Soweit, so gut... Zum Testen eine simple Klasse
[Serializable]
public class User {
public string vorname{get;set;}
public string nachname{get;set;}
public int id {get;set;}
public User(string VN, string NN, int ID) {
vorname = VN;
nachname = NN;
id = ID;
}
public override string ToString() {
return string.Format("{0}: {1}
{2}",this.GetHashCode(),vorname,nachname);
}
}
und ein Ablauf
[STAThread]
static void Main() {
var u = new User("Fritz", "Test", 1);
var m=new MementoStack<User>();
m.SaveState(u);
u.vorname = "test";
m.SaveState(u);
u.vorname = "test2";
m.SaveState(u);
u.vorname = "test3";
u = m.Undo(); //neue Instanz: HashCode in u.ToString()
u = m.Undo();
u = m.Undo();
}