Если вы подписываете событие .net с тем же подпиской более одного раза, то ваш подписанный метод будет вызываться в то же время, что и подписка. И если вы отмените подписку только один раз, это будет всего один минус этого звонка. Это означает, что вы должны отказаться от подписки на такое же время, что и подписка, иначе u будет получать информацию. Иногда вы не хотите этого делать.
Чтобы предотвратить перехват обработчика события дважды, мы можем реализовать событие следующим образом.
private EventHandler foo;
public event EventHandler Foo
{
add
{
if( foo == null || !foo.GetInvocationList().Contains(value) )
{
foo += value;
}
}
remove
{
foo -= value;
}
}
Теперь я хотел бы реализовать Messageharp EventInterceptionAspect, чтобы сделать это решение общим, чтобы я мог применять PreventEventHookedTwiceAttribute
для каждого события, чтобы сэкономить много кода. Но я не могу понять, как проверить добавление второй части следующего условия. Я имею в виду foo.GetInvocationList(). Содержит (значение). My 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, так как функции по умолчанию здесь достаточно.