В моем классе я хочу объявить событие, на которое могут подписаться другие классы. Что корректный путь состоит в том, чтобы объявить событие?
Это не работает:
public event CollectMapsReportingComplete;
Вы забыли упомянуть тип . Для действительно простых событий может быть достаточно 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;
Вам необходимо указать тип делегата для события:
public event Action CollectMapsReportingComplete;
Здесь я использовал System.Action
, но вы можете использовать любой тип делегата по вашему желанию (даже пользовательский делегат). Экземпляр указанного вами типа делегата будет использоваться в качестве резервного поля для события.
Пример
/// </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;