Обработчики событий могут быть любого типа делегата, а не просто EventHandler
.
Если вы хотите вернуть результат, просто измените событие на использование
Func<CustomEventArgs, YourReturnType>
Вот примеркод:
using System;
class Program
{
public class Ev
{
public int? RaiseSomeEvent()
{
if (SomeEvent != null)
{
return SomeEvent();
}
return null;
}
public event Func<int> SomeEvent;
}
static void Main(string[] args)
{
var ev = new Ev();
ev.SomeEvent += ev_someEvent1;
ev.SomeEvent += ev_someEvent2;
int? value = ev.RaiseSomeEvent();
Console.WriteLine(value.HasValue ? value.Value.ToString() : "(null)");
}
static int ev_someEvent1()
{
return 5;
}
static int ev_someEvent2()
{
return 6;
}
}
Вывод этого кода:
6
Несколько обработчиков событий
Обратите внимание, что вы получаете только последнее значение, возвращаемое всеми обработчиками событий.
Если вы хотите обрабатывать несколько возвращаемых значений в некотором смысле, похожем на событие, вы можете проверить VisitorШаблон дизайна вместо.Если вы используете этот шаблон, вам придется создать адаптер для посетителей (или адаптеры для посетителей), в котором есть методы Accept
.