同じサブスクライブで.netイベントを複数回サブスクライブすると、サブスクライブされたメソッドはサブスクライブと同じ回数呼び出されます。そして、あなたが一度だけ退会するならば、それは電話へのたった1つのマイナスになります。つまり、サブスクライブした回数と同じ回数、サブスクライブを解除する必要があります。そうしないと、uに通知され続けます。時々あなたはそれをしたくない。
イベントハンドラーが2回フックされるのを防ぐために、次のようにイベントを実装できます。
private EventHandler foo;
public event EventHandler Foo
{
add
{
if( foo == null || !foo.GetInvocationList().Contains(value) )
{
foo += value;
}
}
remove
{
foo -= value;
}
}
ここで、Postsharp EventInterceptionAspectを実装してこのソリューションを汎用化し、PreventEventHookedTwiceAttribute
すべてのイベントに適用して多くのコードを節約できるようにします。しかし、次の条件の2番目の部分を追加で確認する方法がわかりません。私はfoo.GetInvocationList()。Contains(value)を意味します。私のPreventEventHookedTwiceAttributeは次のようになります。
[Serializable]
public class PreventEventHookedTwiceAttribute: EventInterceptionAspect
{
public override void OnAddHandler(EventInterceptionArgs args)
{
if(args.Event == null || secondConditionRequired) // secondConditionRequired means it is required.
{
args.ProceedAddHandler();
}
}
}
ここではデフォルトの機能で十分なので、OnRemoveHandlerをオーバーライドする必要はありません。