массив событий в C#?

Если вы опускаете фигурные скобки в функции стрелки, вы создаете неявный возврат , который эквивалентен созданию явного возврата с фигурными скобками, например: () => { return throw 42 };

Однако , вы можете вернуть только выражений , но не выражений . И throw это утверждение.

7
задан Nefzen 12 June 2009 в 14:49
поделиться

3 ответа

На самом деле нет понятия массива событий - это все равно что говорить о массиве свойств. На самом деле события - это просто методы, которые позволяют вам подписываться и отказываться от подписки. Если вам нужно иметь возможность делать это по индексу, я предлагаю вам просто иметь пару методов. ( AddCommandHandler (int, RecvCommandHandler) и RemoveCommandHandler (int, RecvCommandHandler) ). Это, конечно, не будет поддерживать синтаксический сахар нормальной обработки событий, но я не вижу много альтернативы.

8
ответ дан 6 December 2019 в 08:45
поделиться

Другой вариант - указать и индексировать в прототипе делегата и иметь один обработчик событий, который «делегирует» другим, например:

public delegate void RecvCommandHandler (int id, ChatApplication sender, byte[] content);

// ...

private RecvCommandHandler[] internalhandlers;

public void MyCommandHandler(int id, ChatApplication sender, byte[] content)
{
    internalHandlers[id](id, sender, content);
}
2
ответ дан 6 December 2019 в 08:45
поделиться

Я просто искал тот же ответ, однако мой класс также является отправителем событий для WPF, поэтому он должен выглядеть так же, как обычный класс отправителя событий C#/WPF. Поэтому я просто добавил следующее:

Отправителю:

  • перечисление с именем свойства -- это хромой обходной путь из-за отсутствия имени
  • один дополнительный метод для записи запросов

получателю:

  • запрос события для задано перечисление

Код, отправитель:

    public enum Properties
    {
        NetworkFileName,
        DatasetFileName,
        LearningWatch
    }

    private string network_filename;
    public string NetworkFileName 
    {
        get { return network_filename; }
        private set 
        {
            if (network_filename != value)
            {
                network_filename = value;
                OnPropertyChanged(Properties.NetworkFileName.ToString());
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string name)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(name));
        }
    }

    public void OnChange(Properties prop, Action<object, PropertyChangedEventArgs> action)
    {
        PropertyChanged += new PropertyChangedEventHandler((obj, args) => { if (args.PropertyName == prop.ToString()) action(obj, args); });
    }

И получателю:

    private void OnNetworkLoaded(object sender, PropertyChangedEventArgs e)
    {
        SetTitle();
    }

        ...
        ExpManager.OnChange(ExperimentManager.Properties.DatasetFileName, OnDatasetLoaded);

Это все еще некрасиво, но по крайней мере:

  • Мне не нужно иметь дело с "если" в получателе
  • Я может легко создавать несколько обработчиков событий
  • он совместим с WPF
  • нет волшебных строк (я их ненавижу)

Недостаток:

  • обсфускация разрушает это (но у меня есть специальный класс для этого случая, этот проект просто для меня, так что здесь нет проблем)
0
ответ дан 6 December 2019 в 08:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: