Получение EventArgs в вызывающем классе - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть класс, который вызывает другой класс - у нового класса есть события, которые я для него определил.Я подписан на события в моем вызывающем классе, но мой вызывающий класс не может получить 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 Ответ

0 голосов
/ 25 сентября 2018

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

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

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 аргументов.Это довольно стандартная модель производителя / потребителя событий.

...