W mojej klasie chcę zadeklarować wydarzenie, które inne klasy mogą subskrybować. Jaki jest prawidłowy sposób deklarowania zdarzenia?Jaka jest składnia deklarowania zdarzenia w języku C#?
To nie działa:
public event CollectMapsReportingComplete;
W mojej klasie chcę zadeklarować wydarzenie, które inne klasy mogą subskrybować. Jaki jest prawidłowy sposób deklarowania zdarzenia?Jaka jest składnia deklarowania zdarzenia w języku C#?
To nie działa:
public event CollectMapsReportingComplete;
zapomniałeś wspomnieć typ. Dla naprawdę prostych zdarzeń, EventHandler
może wystarczyć:
public event EventHandler CollectMapsReportingComplete;
Czasami będziesz chciał zadeklarować swój własny typ delegata do wykorzystania dla swoich imprez, dzięki czemu można użyć niestandardowego typu parametru EventArgs
(patrz komentarz Adama Robinsona):
public delegate void CollectEventHandler(object source, MapEventArgs args);
public class MapEventArgs : EventArgs
{
public IEnumerable<Map> Maps { get; set; }
}
można również użyć rodzajowe EventHandler
typ zamiast deklarowania własnych typów:
public event EventHandler<MapEventArgs> CollectMapsReportingComplete;
Nie pójdziemy na to, ale konwencja w .NET jest taka, że delegaci zdarzeń powinni zawierać tylko nadawcę ("obiekt") i jeden dodatkowy parametr, który dziedziczy po 'EventArgs'. Wykonanie tej czynności umożliwi także użycie ogólnego typu 'EventHandler
@Adam: Masz absolutną rację, i zaktualizowałem swoją odpowiedź, aby to odzwierciedlić. –
musisz określić typ delegata zdarzenia:
public event Action CollectMapsReportingComplete;
Tutaj użyłem System.Action
ale można użyć dowolnego typu delegata chcesz (nawet zwyczaj delegata). Wystąpienie określonego typu delegata będzie używane jako pole zaplecza dla zdarzenia.
public event EventHandler MyEvent;
Przykład
/// </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;
zdarzenie publicznych [DelegateType] [EventName];
@IlliaRatkevych Podoba mi się posiadanie tego pytania tutaj, układ SO jest łatwiejszy do przeczytania niż większość dokumentacji MSDN. –
@IlliaRatkevych Nie zgadzam się - SO nie jest przeznaczone do użycia dla "ekspertów" programistów, ma pomóc wszystkim programistom na wszystkich poziomach. To jest całkowicie uzasadnione pytanie w mojej uczciwej opinii. –