2010-10-14 6 views
6

Je suis en train de développer une classe EventManager pour m'assurer qu'aucun événement n'est laissé filaire aux clients duplex WCF morts, et aussi pour empêcher le câblage multiple d'un même client vers un événement.Passage de délégué comme paramètre de méthode

Maintenant, fondamentalement, je suis ce qui est bloqué avec essaie de passer le délégué de l'événement à une fonction qui contrôlera l'affectation comme ceci.

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

Pour appeler ceci:

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

Mise à jour

Le code wrapper SomeEventDelegate est:

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

event SomeEventHandler SomeEvent; 

Il est évident que le délégué n'est pas retourné au myObject. SomeEventDelegate Et je ne peux pas retourner le délégué de la méthode parce que j'ai besoin d'une validation après aussi. Avez-vous une idée sur la façon de faire cela?

+0

vous pouvez combiner les délégués à l'aide + = – Andrey

+1

événements C# génèrent un délégué caché pour vous. Pour accéder à cet événement, référez-vous à: 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 –

Répondre

5

Utilisez le 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) 
} 

Notez également qu'il existe un joli sucre syntaxique (en C# 2.0) pour l'attribution et la combinaison de délégués (voir this article, par exemple):

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

On m'a fait remarquer que ref ne fonctionne qu'avec des champs, pas des propriétés. Dans le cas d'une propriété, une variable intermédiaire peut être utilisé:

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

Notez que cela ne fonctionnera que si SomeeventDelegate est un champ ... Les propriétés ne peuvent pas être passées en tant que paramètres ref –

+0

salut là, le mot clé ref ne fonctionne pas ici car myObject.SomeEventDelegate est juste une propriété wrapper pour rendre le délégué d'événement accessible en dehors de sa classe. –

+0

@Thomas: Ah, bon point. J'avais oublié ça. Dans ce cas, une variable intermédiaire peut être utilisée. Modification ... – Cameron

Questions connexes