Как мне вернуть элемент из пользовательского обработчика событий? - PullRequest
4 голосов
/ 09 февраля 2011

Проект, над которым я работаю, требует, чтобы я мог запускать событие при каждом добавлении элемента в список.Для этого я создал собственный класс List, унаследованный от List, и добавил событие OnAdd.Я также хочу вернуть элемент, добавляемый как EventArgs, для которого я добавил еще немного кода (приведенного ниже):

    public class ClientListObservable<Client>:List<Client>
    {
        public event EventHandler<EventArgs<Client>> OnAdd;

        public void Add(Client item)
        {
            if (null != OnAdd)
            {
                OnAdd(this, new EventArgs<Client>(item));
            }

            base.Add(item);
        }
    }

    public class EventArgs<Client> : EventArgs
    {
        public EventArgs(Client value)
        {
            m_value = value;
        }

        private Client m_value;

        public Client Value
        {
            get { return m_value; }
        }
    }

Вот как я добавляю обработчик

clientList.OnAdd += new EventHandler<EventArgs<Client>>(clientList_OnAdd);

Но,в методе OnAdd:

private void clientList_OnAdd(object sender, EventArgs e)
        {
            //want to be able to access the data members of the Client object added
        }

Я могу получить доступ только к e.Equals, e.GetHashCode, e.GetType и e.ToString и ни к одному из членов класса Client.

Ответы [ 4 ]

6 голосов
/ 09 февраля 2011

Измените аргументы вашего события на:

public class ClientEventArgs : EventArgs
{
    public ClientEventArgs(Client value)
    {
        m_value = value;
    }

    private Client m_value;

    public Client Value
    {
        get { return m_value; }
    }
}

Тогда:

    private void clientList_OnAdd(object sender, ClientEventArgs e)
    {
        Client client = e.Value;
    }
3 голосов
/ 09 февраля 2011

Разве ваш обработчик событий не должен быть объявлен так:

private void clientList_OnAdd(object sender, EventArgs<Client> e)

?

1 голос
/ 09 февраля 2011

Создайте свои собственные аргументы событий, которые расширяют EventArgs и имеют открытое свойство объекта «Клиент».Затем при добавлении заполните пользовательские EventArgs новым элементом и верните его.

1 голос
/ 09 февраля 2011

вы должны получить свой собственный класс из EventArgs и иметь член для размещения там ваших пользовательских объектов, затем вы должны вызвать событие, передавая такие специализированные EventArgs, которые вы бы создали и инициализировали по мере необходимости.

...