Я пытаюсь реализовать функцию отмены с делегатами C #. По сути, у меня есть UndoStack, который поддерживает список делегатов, реализующих каждую операцию отмены. Когда пользователь выбирает Edit: Undo, этот стек выскакивает из первого делегата и запускает его. Каждая операция отвечает за передачу соответствующего делегата отмены в стек. Итак, предположим, у меня есть метод с именем «SetCashOnHand». Это выглядит так:
public void SetCashOnHand(int x) {
int coh = this.cashOnHand;
undo u = () => this.setCashOnHand(coh);
this.cashOnHand = x;
undoStack.Push(u);
}
Таким образом, этот метод создает делегат отмены, выполняет операцию и (при условии, что он успешен) помещает делегат отмены в UndoStack. (UndoStack достаточно умен, чтобы при вызове undoStack.Push в контексте отмены делегат отправлялся в стек повторного выполнения.)
Моя проблема в том, что немного раздражает кеширование this.cashOnHand в переменную coh. Я хотел бы просто написать это:
undo u = () => this.setCashOnHand(this.cashOnHand);
Но, конечно, это не даст настоящее значение cashOnHand; он откладывает поиск значения до вызова делегата, поэтому код ничего не делает. Есть ли способ, которым я могу «разыменовать» cashOnHand при создании делегата, кроме вставки значения в локальную переменную, например, coh?
Мне не очень интересно слышать о лучших способах отмены. Пожалуйста, подумайте об этом как об общем вопросе о делегатах, а «Отменить» - просто пример, чтобы сделать вопрос более ясным.