У меня есть метод расширения, который вызывает отменяемые события, возвращая bool, если они отменены:
public static bool RaiseCancel<T>(this EventHandler<T> ev, object sender, T e) where T : CancelEventArgs
{
if (ev == null)
{
return false;
}
foreach (Delegate del in ev.GetInvocationList())
{
try
{
ISynchronizeInvoke invoke = del.Target as ISynchronizeInvoke;
if (invoke != null && invoke.InvokeRequired)
{
invoke.Invoke(del, new[] { sender, e });
}
else
{
del.DynamicInvoke(sender, e);
}
}
catch (TargetInvocationException ex)
{
throw ex.InnerException;
}
// if (e.Cancel) return true;
}
return e.Cancel;
}
Однако, я не могу не думать, что он должен немедленно вернуться, когда обработчик отменяет его ради эффективности, а не продолжать вызывать оставшиеся обработчики. Насколько мне известно, ни один обработчик отменяемого события НИКОГДА не должен предпринимать никаких действий, кроме как установить для свойства Cancel
значение true. В таком случае, какой смысл просить больше обработчиков принять решение, которое уже принято? С другой стороны, кажется неправильным НЕ вызывать обработчик события, когда это происходит, если объект прослушивает событие.
Должен ли я раскомментировать оператор if (и заменить возвращаемое значение в конце метода на return false;
) или нет?
РЕДАКТИРОВАТЬ: Я полагаю, если вы собираетесь продолжать вызывать обработчики, должен ли я позволять самим обработчикам принимать решение (то есть, они могут иметь if (e.Cancel) return;
в начале обработчика), если они хотят?