Из класса, который объявляет событие, вы можете получить список вызовов этого события (при условии, что это событие в виде поля). Вызов каждого из них по отдельности позволит вам проверить возвращаемое значение каждого подписчика на событие.
Например:
public event Func<bool> MyEvent = delegate { return false; };
...
private bool EmitMyEventAndReturnIfAnySubscriberReturnsTrue()
{
return MyEvent.GetInvocationList()
.Cast<Func<bool>>()
.Select(method => method())
.ToList() //Warning: Has side-effects
.Any(ret => ret);
}
В этом примере каждый подписчик информируется о событии - короткое замыкание не происходит, если какой-либо из них отвечает положительно. Это поведение может быть легко изменено при желании, удалив вызов на ToList()
.
Если честно, мне не очень нравятся события, которые возвращают значения; их семантика не очевидна для подписчиков. Я бы изменил дизайн, если это вообще возможно.
EDIT: исправлена ошибка принудительного полного выполнения последовательности на основе комментария Тимви.