2010-10-14 13 views
6

Obecnie rozwijam klasę EventManager, aby upewnić się, że żadne zdarzenia nie zostały podłączone do martwych klientów dupleksu WCF, a także aby zapobiec wielu połączeniom od tego samego klienta do jednego zdarzenia.Przekazywanie delegata jako parametr metody

W gruncie rzeczy utknąłem w tym, że przekazuję delegatowi wydarzenia do funkcji, która będzie kontrolować takie zadanie.

var handler = new SomeEventHandler(MyHandler); 
Wire(myObject.SomeEventDelegate, handler); 

na to wezwanie:

private void Wire(Delegate eventDelegate, Delegate handler) 
{ 
    // Pre validate the subscription. 
    eventDelegate = Delegate.Combine(eventDelegate, handler); 
    // Post actions (storing subscribed event delegates in a list) 
} 

Aktualizacja

Kod dla SomeEventDelegate owijki jest:

public Delegate SomeEventDelegate 
{ 
    get { return SomeEvent; } 
    set { SomeEvent = (SomeEventHandler) value; } 
} 

event SomeEventHandler SomeEvent; 

Oczywiście delegat nie jest zwracane do myObject. SomeEventDelegate I nie mogę zwrócić Delegata z metody, ponieważ potrzebuję też po niej walidacji. Czy masz pojęcie, jak to zrobić?

+0

można połączyć za pomocą delegatów + = – Andrey

+1

C# zdarzenia generują ukryty delegata dla Ciebie. Aby uzyskać dostęp do tego wydarzenia, zobacz: http://stackoverflow.com/questions/1129517/c-how-to-find-if-an-event-is-hooked-up/1129530#1129530. –

+0

http://izlooite.blogspot.com/2011/02/delegates-vs-methods.html –

Odpowiedz

5

Użyj C# ref parameter modifier:

var handler = new SomeEventHandler(MyHandler); 
Wire(ref myObject.SomeEventDelegate, handler); 

private void Wire(ref Delegate eventDelegate, Delegate handler) 
{ 
    // Pre validate the subscription. 
    eventDelegate = Delegate.Combine(eventDelegate, handler); 
    // Post actions (storing subscribed event handlers in a list) 
} 

Należy również zauważyć, że istnieje jakieś fajne cukier syntaktyczny (od C# 2.0) do przypisywania i łączenie delegatów (patrz this article, na przykład):

Wire(ref myObject.SomeEventDelegate, MyHandler); 

private void Wire(ref Delegate eventDelegate, Delegate handler) 
{ 
    // Pre validate the subscription. 
    eventDelegate += handler; 
    // Post actions (storing subscribed event handlers in a list) 
} 

Zostało mi wskazane, że ref działa tylko z polami, a nie z właściwościami. W przypadku nieruchomości, zmienna pośrednikiem można stosować:

var tempDelegate = myObject.SomeEventDelegate; 
Wire(ref tempDelegate, MyHandler); 
myObject.SomeEventDelegate = tempDelegate; 
+0

Zauważ, że będzie działać tylko wtedy, gdy SomeeventDelegate jest polem ... Właściwości nie mogą być przekazywane jako parametry ref –

+0

cześć tam, słowo kluczowe ref nie działa tutaj, ponieważ myObject.SomeEventDelegate jest po prostu właściwością opakowania, aby delegowanie zdarzenia było dostępne poza jego klasą. –

+0

@Thomas: Ah, dobry punkt. Zapomniałem o tym. W takim przypadku można użyć zmiennej pośredniej. Edycja ... – Cameron

Powiązane problemy