Speichern Sie eine Referenz in einer anderen variable
Ich habe lange gesucht, um ein bisschen, aber ich finde keine Möglichkeit, um zu speichern eine Referenz auf eine andere variable, die in eine bestimmte variable.
Ich versuche, mich eine Klasse rückgängig zu machen, Dinge zu erledigen, die durch den Benutzer;
class UndoAction
{
public object var;
public object val;
public UndoAction(ref object var, object val)
{
this.var = var;
this.val = val;
}
public static List<UndoAction> history = new List<UndoAction>();
public static void AddHistory(ref object var, object val)
{
history.Add(new UndoAction(ref var, val));
}
}
Ich denke, man kann sehen, was ich versuche hier zu erreichen.
Ich das problem ran;
this.var = var;
speichert keine Referenz, sondern der Wert der referenzierten 'var'.
Wie kann ich speichern Sie die Referenz selbst, so kann ich das einfach ausführen;
this.var = val;
"rückgängig" eine Aktion, in meinem Fall?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Standard sicher C# nicht unterstützt, überhaupt. Das zugrunde liegende framework hat fast alle notwendigen Konzepte, aber Sie sind nicht ausgesetzt, die in der Sprache C#. Aber selbst dann, eine solche Referenz kann nicht gespeichert werden, in ein Feld.
Die besten, die Sie haben können, zu wickeln, es in eine Klasse, die verwendet Delegierten. Das ist natürlich ziemlich teuer im Vergleich, aber es sei denn, Sie ändern die Dinge, die in einer engen Schleife dieses vielleicht gut genug:
Und dann verwenden Sie es wie diese:
Gehen über es der falsche Weg.
Boxing/Unboxing ist nicht, was Sie brauchen, müssen Sie speichern die Objektreferenz und die spezifische Eigenschaft, und diese Eigenschaft den Wert.
Nicht versuchen, eine komplett generisches system, das rückgängig machen kann Erschaffung der menschlichen Rasse.
Starten Sie einfach.
Starten, indem Sie bestimmte Objekte mit einer Schnittstelle wie... IUndoable.
Mark bestimmte Eigenschaften mit einem Attribut wie [UnduableProperty]
Verwenden Sie die INotifyPropertyChange Schnittstelle, und verwenden Sie das PropertyChanged-Ereignis.
Wenn eine Eigenschaft geändert wird, wird es hören, prüfen, ob es rückgängig gemacht werden, und speichern Sie seinen Wert.
Nicht Angst, auf die Reflexion, sondern versuchen, es zu vermeiden, wenn Sie können für die speed-Probleme.
Das Objekt speichern, speichern Sie die Eigenschaft, den Wert speichern.
Erstellen Sie ein manager-Objekt zum verwalten der undo-Prozess.
Wenn Sie Probleme beim speichern der Wert der komplexen Strukturen, vergessen Sie nicht über ISerializable.
Glück.
In C# jede Klasse erbt ein Objekt ein Referenztyp sein.
das bedeutet, dass es sei denn, Sie werden ausdrücklich Klonen Sie das Objekt, haben Sie die nur als Referenz und nicht ein neues Objekt.
wenn Sie sehen, dass diese.var hält das Objekt ist, weil die Umgebung blendet es aus und Sie nicht haben, um zu wissen, die Referenz-Adresse selbst.