Звучит так, будто вы хотите событие. В .NET событие - это просто делегат, который по соглашению имеет специальную подпись. Вот пример C # объявления события в классе:
public class MyObject
{
// ...
public event EventHandler ProcessingComplete;
// ...
}
EventHandler - это делегат с двумя параметрами:
public delegate EventHandler(object sender, EventArgs e);
Отправитель - это объект, вызвавший событие, а EventArgs кодируют любую информацию, которую вы хотите передать подписчику события.
Ожидается, что каждое событие будет следовать этой конвенции. Если вы хотите передать специализированную информацию для вашего события, вы можете создать свой собственный класс, полученный из EventArgs. .NET для этой цели определяет типизированный делегат EventHandler EventHandler<TEventArgs>
. Пример C #:
class ProcessingCompleteEventArgs : EventArgs
{
public ProcessingCompleteEventArgs(int itemsProcessed)
{
this.ItemsProcessed = itemsProcessed;
}
public int ItemsProcessed
{
get;
private set;
}
}
// ...
// event declaration would look like this:
public event EventHandler<ProcessingCompleteEventArgs> ProcessingComplete;
Чтобы подписаться на событие, используйте оператор +=
. Чтобы отписаться, используйте оператор -=
.
void Start()
{
this.o = new MyObject();
this.o.ProcessingComplete += new EventHandler(this.OnProcessingComplete);
// ...
}
void Stop()
{
this.o.ProcessingComplete -= new EventHandler(this.OnProcessingComplete);
}
void OnProcessingComplete(object sender, EventArgs e)
{
// ...
}
Внутри вашего класса, чтобы вызвать событие, вы можете использовать обычный синтаксис для вызова делегата:
void Process()
{
// ...
// processing is done, get ready to fire the event
EventHandler processingComplete = this.ProcessingComplete;
// an event with no subscribers is null, so always check!
if (processingComplete != null)
{
processingComplete(this, EventArgs.Empty);
}
}