Usuwanie "eventhandlers"

0
 
void Change(Class1 obj)
{
   Clear();
   var ev = new Action<string>(func1);
   delegates.Add(ev);
   obj.Add += func1;
}

void Clear()
{
   while (delegates.Count > 0)
   {
      var d = delegates[0];
      delegates.Remove(d);
      d = null;
   }
}

Powyższy kod nie działa, ale jest to schemat, który by mnie "zadowalał". Muszę podpiąć pod różne zdarzenia z różnych obiektów konkretne funkcje. Te delegaty mogę zebrać w jednym miejscu, np. liście ("delegates"). Jednak przy zmianie i przypisaniu muszę wcześniej je pousuwać, co powinna robić funkcja Clear().
Jak można wprawić to wszystko w ruch, by działało jak powinno ?
Od razu mówię, że nie mogę całkowicie wyczyścić "InvocationList" z danego eventu. Mogą tam być przypisane również inne funkcje, które muszą pozostać. Chcę usunąć jedynie to co przypisałem wewnątrz tej funkcji, dlatego zbieram je na liście.
Dobrze by było gdyby rozwiązanie było stosunkowo szybkie.

0

Dziwne toto. Co chcesz osiągnąć?

var ev = new Action<string>(func1);
delegates.Add(ev);
obj.Add += func1;
Po co dwa razy trzymasz to samo, raz w obj a drugi raz w delegates? I czym one są?

Wiesz że zwykły event działa już jak lista?

Wiesz że można zrobić obj.Add -= func1;?

1

W eventach masz dwie role:

  • broadcaster - obiekt który zawiera event.
  • subscribers - obiekty które nasłuchują zdarzenia

Obiekty subskrybujące mogą wykonać dwie akcje na evencie:

  • zacząć słuchać, czyli += (add)
  • przestać subskrybować zdarzenie, czyli -= (remove)

Z założenia nie mają one mieć informacji o tym jakie inne obiekty nasłuchują zdarzenia.

Muszę podpiąć pod różne zdarzenia z różnych obiektów konkretne funkcje.

Skoro masz różne funkcje, różne obiekty to dlaczego chcesz te informacje umieścić na JEDNEJ liście?

0

Z założenia nie mają one mieć informacji o tym jakie inne obiekty nasłuchują zdarzenia.
No to się da zrobić, na przykład na własnych akcesorach add i remove, tylko po co.

0

Sam problem rozwiązałem w banalny sposób - mianowicie przechowuje obiekt przekazany przez argument w zmiennej. Przy ponownym wywołaniu mogę odpiąć zdarzenia, podmienić obiekty i ponownie podpiąć pod nowy.
Jeśli chodzi o same teoretyczne rozwiązanie problemu - chodziło mi o to, by zebrać te wszystkie delegaty, które łączą eventy z funkcjami w jedno miejsce, w tym wypadku listę tak by móc je zniszczyć z poziomu listy. Innymi słowy, nie musiałbym wiedzieć jaki to event i do czego jest podpięty (czyli nie mam tego obiektu klasy Class1) - po prostu hurtowo je odpiąć, ale tak chyba zrobić nie można (a przynajmniej ja nie znalazłem takiego sposobu).

1 użytkowników online, w tym zalogowanych: 0, gości: 1