Я знаю, что это старый пост, но на случай, если кто-нибудь с ним столкнется, это, безусловно, возможно сделать. Вы объявляете свой собственный делегат, который возвращает значение, а затем основываете событие на этом новом делегате. Вот пример:
В объявителе / издателе события:
// the delegate
public delegate string ReturnStringEventHandler(object sender, EventArgs args);
// the event
public event ReturnStringEventHandler StringReturnEvent;
// raise the event
protected void OnStringReturnEvent(EventArgs e)
{
if (StringReturnEvent != null) // make sure at least one subscriber
// note the event is returning a string
string myString = StringReturnEvent(this, e);
}
В подписчике события:
// Subscribe to event, probably in class constructor / initializer method
StringReturnEvent += HandleStringReturnEvent;
// Handle event, return data
private string HandleStringReturnEvent(object sender, EventArgs e)
{
return "a string to return";
}
.NET предоставляет пример этого в событии AssemblyResolve, которое использует делегат ResolveEventHandler для возврата данных, в данном случае это ссылка на требуемую сборку. Статья MSDN о событии AssemblyResolve
Я лично использовал событие AssemblyResolve и метод пользовательского делегата для возврата данных из события, и они оба работают, как и ожидалось, в Visual Studio 2010.