それはあなたがイベントを望んでいるように聞こえます。.NETでは、イベントは単なるデリゲートであり、慣例により特別な署名があります。クラスでイベントを宣言するC#の例を次に示します。
public class MyObject
{
// ...
public event EventHandler ProcessingComplete;
// ...
}
EventHandlerは、次の2つのパラメーターを持つデリゲートです。
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);
}
}