Mam zestaw zdarzeń, które mają ten sam podpis. teraz zastanawiam się, czy mogę stworzyć ogólny sposób obsługi zdarzeń, aby zrobić to dla wszystkich wydarzeń?Tworzenie ogólnej metody generowania zdarzeń
- Czy można wysłać wydarzenie jako
<T>
?
Mam zestaw zdarzeń, które mają ten sam podpis. teraz zastanawiam się, czy mogę stworzyć ogólny sposób obsługi zdarzeń, aby zrobić to dla wszystkich wydarzeń?Tworzenie ogólnej metody generowania zdarzeń
<T>
?Jeśli to wszystko w ramach jednej klasy, można dokonać sposób podnieść zdarzenie, które współpracuje z ktokolwiek z nich. Na przykład, jeśli zdarzenia wszyscy byli EventHandler<T>
, można użyć:
private void RaiseEvent<T>(EventHandler<T> eventHandler, T eventArgs)
{
if (eventHandler != null)
{
eventHandler(this, eventArgs);
}
}
Następnie można nazwać to poprzez:
this.RaiseEvent(this.MyEvent, new MyEventArgs("Foo"));
Zobacz this. Opisuje to, co chcesz.
Można utworzyć wpisane zdarzenia za pomocą wpisywanych delegata i korzystając, że dla swojej imprezy:
public delegate void myDel<T>(T stuff);
public event myDel<int> myEvent;
public doStuff()
{
myDel(1);
}
Nie tylko, że nie wydaje się robić to, co PO chce, to nie jest właściwe na SO do * tylko * opublikować link, nawet jeśli ma odpowiedzieć na pytanie. [więcej informacji] (http://meta.stackexchange.com/questions/94022/how-can-i-link-to-an-external-resource-in-a- community-friendly-way) – Servy
dla statycznej wersji odpowiedzi Reed Copsey za stworzyłem klasę statyczną Event
:
public static class Event
{
public static bool Raise<T>(Object source, EventHandler<T> eventHandler, T eventArgs) where T : EventArgs
{
EventHandler<T> handler = eventHandler;
if (handler != null)
{
handler(source, eventArgs);
return true;
}
return false;
}
}
ta zakłada także twoi obsługi zdarzeń są typu EventHandler<T>
. Typ powrotu został zmieniony z void
na bool
i zwraca, czy były jakieś detektory zdarzenia. Rzadko używane, więc możesz wrócić do wersji void
.
Przykład użycia:
public event EventHandler<FooArgs> FooHappend;
public void Foo()
{
Event.Raise(this, FooHappend, new FooArgs("Hello World!");
}
z tą procedurą, czy istnieje potrzeba umieszczenia programu obsługi w zmiennej lokalnej przed sprawdzeniem zerowej wartości, aby uniknąć sytuacji wyścigu? –
@ mohsen.d Nie ma wyścigu. eventHandler jest parametrem. – CrazyCasta
@Reed Copsey przepraszam, ale czy możesz wyjaśnić trochę więcej? dziękuję –