В моем классе я хочу объявить событие, на которое могут подписаться другие классы. Каков правильный способ объявления события?
Это не работает:
public event CollectMapsReportingComplete;
Ответ 1
Вы забыли упомянуть тип. Для действительно простых событий EventHandler может быть достаточно:
public event EventHandler CollectMapsReportingComplete;
Иногда вам нужно объявить свой собственный тип делегата, который будет использоваться для ваших событий, что позволит вам использовать нестандартный тип для параметра EventArgs (см. комментарий Адама Робинсона):
public delegate void CollectEventHandler(object source, MapEventArgs args);
public class MapEventArgs : EventArgs
{
public IEnumerable<Map> Maps { get; set; }
}
Вы также можете использовать общий тип EventHandler вместо объявления своих собственных типов:
public event EventHandler<MapEventArgs> CollectMapsReportingComplete;
Ответ 2
Вам нужно указать тип делегирования события:
public event Action CollectMapsReportingComplete;
Здесь я использовал System.Action, но вы можете использовать любой тип делегата, который вы хотите (даже пользовательский делегат). Экземпляр указанного типа делегата будет использоваться в качестве поля поддержки для события.
Ответ 3
Пример
/// </summary>
/// Event triggered when a search is entered in any <see cref="SearchPanel"/>
/// </summary>
public event EventHandler<string> SearchEntered
{
add { searchevent += value; }
remove { searchevent -= value; }
}
private event EventHandler<string> searchevent;