Получение EventArgs в вызывающем классе

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

Мой код сокращен ниже. WorkControl является основным процессом и вызывает MyProcess, который выполняет некоторый код и запускает событие.

public class WorkControl
{
    public MyProcess myp;

    public WorkControl()
    {
            myp.InBoxShareDisconnected += OnShareFolderDisconnected();
        }

        private EventHandler OnShareFolderDisconnected<NetworkShareDisconnectedEventArgs>()
        {
          // How do I get my EventArgs from the event?
           throw new NotImplementedException();
        }

}

public class MyProcess
{
    public void MyDisconnectTrigger
    {
             NetworkShareDisconnectedEventArgs e = 
new NetworkShareDisconnectedEventArgs(path, timestamp, connected);

                OnInBoxShareDisconnected(e);
    }

        public event EventHandler<NetworkShareDisconnectedEventArgs> InBoxShareDisconnected;

        protected void OnInBoxShareDisconnected(NetworkShareDisconnectedEventArgs e)
        {
          //  InBoxShareDisconnected(this, e);
            InBoxShareDisconnected.SafeInvoke(this, e);
        }
}

1 ответ

Решение

У вас есть пара проблем. Ваш MyProcess класс не должен вызывать события в конструкторе и MyWorker класс должен иметь экземпляр MyProcess прикрепить событие к. Другая проблема заключается в том, что вам нужно правильно объявить обработчик событий.

Давайте посмотрим на правильный шаблон событий для вашего производителя MyProcess учебный класс:

public class MyProcess
{
    public event EventHandler<NetworkShareDisconnectedEventArgs> InBoxShareDisconnected;

    public MyProcess()
    {
        //This doesn't really do anything, don't raise events here, nothing will be
        //subscribed yet, so nothing will get it.
    }

    //Guessing at the argument types here
    public void Disconnect(object path, DateTime timestamp, bool connected)
    {
        RaiseEvent(new NetworkShareDisconnectedEventArgs(path, timestamp, connected));
    }

    protected void RaiseEvent(NetworkShareDisconnectedEventArgs e)
    {
        InBoxShareDisconnected?.Invoke(this, e);
    }
}

А теперь мы можем взглянуть на ваш потребительский класс:

public class WorkControl
{
    private MyProcess _myProcess;

    public WorkControl(MyProcess myProcess)
    {
        _myProcess = myProcess;  //Need to actually set it to an object
        _myProcess.InBoxShareDisconnected += HandleDisconnected;
    }

    private void HandleDisconnected(object sender, NetworkShareDisconnectedEventArgs e)
    {
        //Here you can access all the properties of "e"
    }
}

Теперь вы можете использовать события в классе потребителей и иметь доступ ко всем свойствам NetworkShareDisconnectedEventArgs аргументы. Это довольно стандартная модель производителя / потребителя событий.

Другие вопросы по тегам