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