It's Eddie! Ответов: 3

C# - хранить функцию в списке?


Эй Codeproject,

Я знаю, что это может быть странно. Я создаю свой собственный пользовательский элемент управления, и в настоящее время я нахожусь на стадии, когда я могу, наконец, внедрить некоторые функции. Одна из функций, которую я хочу добавить, - это "отменить " и" повторить", теперь я никогда не делал этого раньше, и мое любопытство взяло верх, когда я подумал об использовании списка, содержащего функции" делегата", чтобы сделать простую функцию отмены-повтора.

Теперь, я не уверен, что делегат-это правильное слово для этого, то, что я в значительной степени пытаюсь сделать, это следующее:

public List<Delegate> Undo { get; set; }

       private void SetText(int Index, string String)
        {
            Text.Insert(Index, String);
        }


private void RemoveText(index, String)
{
   Undo.Add(SetText(index, string));
}


Я хочу иметь возможность добавить в список "отменить" функцию SetText (Index, "String"), а затем вызвать ее из функции Undo ();.

private void UndoFunction()
        {
            Undo[Undo.Count - 1]();
            Undo.Remove(Undo[Undo.Count - 1]);
        }


Кто-нибудь знает, возможно ли что-то подобное? Я могу просто найти обходной путь, если это напрямую невозможно, но было бы здорово, если бы это было так.

С Уважением, - Эдди

Что я уже пробовал:

public List<Delegate> Undo { get; set; }

       private void SetText(int Index, string String)
        {
            Text.Insert(Index, String);
        }

3 Ответов

Рейтинг:
22

F-ES Sitecore

Вы можете сделать это с помощью делегата действия

List<Action> Undo = new List<Action>();

Undo.Add(() => SetText(1, "Hello"));
Undo.Add(() => SetText(2, "World"));


foreach (var u in Undo)
{
    u();
}


Или вы можете использовать интерфейсы для создания классов, которые подходят для различных типов действий отмены. Этот метод является более гибким, так как вы можете иметь разные классы, ответственные за разные типы действий со своими собственными параметрами и т. д.

public interface IUndo
{
    void Undo();
}

public class SetTextUndo : IUndo
{
    public int Index { get; set; }
    public string Text { get; set; }

    public void Undo()
    {
        Console.WriteLine("Undo for {0} {1}", this.Index, this.Text);
    }
}

public class FormattingUndo : IUndo
{
    public enum FormatTypeEnum
    {
        Bold,
        Italic,
        Underline
    }

    public FormatTypeEnum FormatType { get; set; }

    public void Undo()
    {
        Console.WriteLine("Undo formatting {0}", this.FormatType);
    }
}


List<IUndo> Undo = new List<IUndo>();

Undo.Add(new SetTextUndo { Index = 1, Text = "Hello" });
Undo.Add(new SetTextUndo { Index = 2, Text = "World" });
Undo.Add(new FormattingUndo { FormatType = FormattingUndo.FormatTypeEnum.Italic });

foreach (var u in Undo)
{
    u.Undo();
}


It's Eddie!

Отлично, именно то, о чем я просил. Большое вам спасибо.

Maciej Los

5ед!

Рейтинг:
1

RickZeeland

Может быть, вы можете использовать Activator, см. этот пример: Класс Активатора (Система)[^]