2012-09-28 15 views

Odpowiedz

10

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")); 
+0

z tą procedurą, czy istnieje potrzeba umieszczenia programu obsługi w zmiennej lokalnej przed sprawdzeniem zerowej wartości, aby uniknąć sytuacji wyścigu? –

+0

@ mohsen.d Nie ma wyścigu. eventHandler jest parametrem. – CrazyCasta

+0

@Reed Copsey przepraszam, ale czy możesz wyjaśnić trochę więcej? dziękuję –

-1

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); 
} 
+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

1

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!"); 
} 
Powiązane problemy