2010-10-14 37 views
6

Actualmente estoy desarrollando una clase EventManager para garantizar que no queden eventos conectados a los clientes dúplex WCF muertos, y también para evitar el cableado múltiple del mismo cliente al único evento.Al pasar delegado como parámetro de método

Ahora, básicamente, estoy atascado tratando de pasar el delegado del evento a una función que controlará la asignación de esta manera.

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

Para llamar a esto:

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

actualización

El código para el envoltorio SomeEventDelegate es:

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

event SomeEventHandler SomeEvent; 

Obviamente no se devuelve el delegado de la myObject. SomeEventDelegate Y no puedo devolver al delegado del método porque también necesito validación alguna. ¿Tiene alguna idea sobre cómo hacer esto?

+0

puede combinar el uso de los delegados + = – Andrey

+1

C# eventos generan un delegado oculto para ti. Para acceder a este evento, consulte: 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 –

Respuesta

5

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

Tenga en cuenta también que existe un poco de azúcar sintáctica agradable (a partir de C# 2.0) para la asignación y la combinación de los delegados (ver this article, por ejemplo):

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

Se me ha indicado que ref solo funciona con campos, no con propiedades. En el caso de una propiedad, una variable intermedia se puede utilizar:

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

Tenga en cuenta que solo funcionará si SomeeventDelegate es un campo ... Las propiedades no se pueden pasar como parámetros de ref –

+0

hola, la palabra clave ref no funciona aquí porque myObject.SomeEventDelegate es solo una propiedad de contenedor para hacer que el delegado del evento esté accesible fuera de su clase. –

+0

@Thomas: Ah, buen punto. Me había olvidado de eso. En ese caso, se puede usar una variable intermedia. Editando ... – Cameron

Cuestiones relacionadas