Estoy tratando de implementar la funcionalidad deshacer con C# delegados. Básicamente, tengo un UndoStack que mantiene una lista de delegados implementando cada operación de deshacer. Cuando el usuario elige Editar: Deshacer, esta pila sale del primer delegado y lo ejecuta. Cada operación es responsable de empujar un delegado de deshacer apropiado a la pila. Entonces supongamos que tengo un método llamado "SetCashOnHand". Se ve así:C# Lambdas: ¿Cómo * No * para aplazar la "desreferencia"?
public void SetCashOnHand(int x) {
int coh = this.cashOnHand;
undo u =() => this.setCashOnHand(coh);
this.cashOnHand = x;
undoStack.Push(u);
}
Así que este método construye un delegado de deshacer, que hace la operación, y (suponiendo que tenga éxito) empuja el delegado de deshacer en el UndoStack. (UndoStack es lo suficientemente inteligente como para llamar a undoStack.Push en el contexto de una operación de deshacer, el delegado va a la pila de rehacer).
Mi problema es que es un poco molesto "cachear" esta.cashOnHand en el variable coh. Ojalá pudiera escribir esto:
undo u =() => this.setCashOnHand(this.cashOnHand);
Pero por supuesto que no va a obtener el valor actual de cashOnHand; difiere buscando el valor hasta que se llame al delegado, por lo que el código termina sin hacer nada. ¿Hay alguna forma de que pueda "eliminar la referencia" de CashOnHand cuando construya el delegado, aparte de rellenar el valor en una variable local como coh?
No estoy realmente interesado en conocer mejores formas de deshacer. Por favor piense en esto como una pregunta genérica sobre delegados, con Deshacer solo el ejemplo para hacer la pregunta más clara.
Supongo que te refieres a _Edit_, Deshacer. – SLaks
Vaya, tienes razón. He arreglado la pregunta. –