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

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

7 голосов
/ 12 июня 2009

в основном:

public delegate void RecvCommandHandler (ChatApplication sender, byte[] content);
event RecvCommandHandler[] commands = new RecvCommandHandler[255];

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

Я думаю, что я пойду с массивом делегатов для этого, но вопрос все еще интересен.

Ответы [ 4 ]

10 голосов
/ 21 апреля 2013

Вы можете создать массив класса с перегрузкой операторов для имитации интересующего вас поведения ...

public delegate void EventDelegate(EventData kEvent);

public class EventElement
{
    protected event EventDelegate eventdelegate;

    public void Dispatch(EventData kEvent)
    {
        if (eventdelegate != null)
        {
            eventdelegate(kEvent);
        }
    }

    public static EventElement operator +(EventElement kElement, EventDelegate kDelegate)
    {
        kElement.eventdelegate += kDelegate;
        return kElement;
    }

    public static EventElement operator -(EventElement kElement, EventDelegate kDelegate)
    {
        kElement.eventdelegate -= kDelegate;
        return kElement;
    }
}

public EventElement[] commands = new EventElement[255];

commands[100] += OnWhatever;
commands[100].Dispatch(new EventData());
commands[100] -= OnWhatever;
8 голосов
/ 12 июня 2009

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

2 голосов
/ 12 июня 2009

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

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);
}
0 голосов
/ 25 августа 2010

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

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

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

Получателю:

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

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

    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
  • нет волшебных струн (я их ненавижу)

Недостатки:

  • омрачение разрушает это (но у меня есть специальный класс для этого случая, этот проект только для меня, так что здесь нет проблем)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...