2011-03-11 7 views
5

sé que muchas personas han hecho la pregunta de "¿Cómo me doy de baja el siguiente"Darse de baja Lambda Gestor de Eventos ** ** con el encierro

myButton.Click += (s, e) => MessageBox.Show("Hello World!"); 

Con la respuesta obvia de

EventHandler HelloWorld = delegate { MessageBox.Show("Hello World!"); }; 
myButton.Click -= HelloWorld; 
myButton.Click += HelloWorld; 

Pero, ¿qué estoy usando una lambda para crear un cierre? ¿Y si mi objeto tiene un evento denominado AssessmentRationChanged que es de tipo Action, y estoy de conectarlo de esta manera:

foreach (MassFMVUpdateDTO dto in CurrentProperties) 
    dto.AssessmentRationChanged +=() => setCellColorBasedOnAssessmentRatioValue(dto); 

¿Qué pasa si hay una posibilidad de que ya he puesto este controlador para algunos/todos los objetos en este bucle? ¿Hay alguna manera de anular su suscripción?

Estoy seguro de que podría usar el reflejo y limpiar el controlador por completo, pero ¿hay una manera más limpia?

Respuesta

5

No, tiene que almacenar las referencias a los delegados, básicamente.

Recuerda todo lo que desees cancelar más adelante.

+0

Grrrr. ¿Entonces probablemente vuelva a trabajar mi diseño y pase un remitente en el evento? - 'Acción ' - Gracias como siempre Jon. –

+1

¿Quién es John? :) – jgauffin

+0

@ Adam: No ha aclarado el resto del contexto para que podamos decir si desea o no cambiar el diseño. No estoy seguro de cómo pasar un remitente ayudaría ... –

1

Desde que escribió esto:

Estoy seguro de que podría utilizar la reflexión y claro el manejador completamente

La respuesta obvia sería utilizar un delegado sencilla en lugar de un evento:

foreach (MassFMVUpdateDTO dto in CurrentProperties) 
    dto.AssessmentRationChanged =() => setCellColorBasedOnAssessmentRatioValue(dto); 
4

puede utilizar la lambda para crear una instancia de delegado que se puede utilizar más tarde para darse de baja:

Action a =() => setCellColorBasedOnAssessmentRatioValue(dto); 

myObject.MyEvent += a; 

// to unsubscribe: 
myObject.MyEvent -= a; 
+0

Esa es una idea clara, el problema es que esto está en un bucle, y hay muchos de esos dto, así que tendré que hacer un seguimiento de qué Acción va con qué DTO, lo que, aunque factible, es un poco doloroso . –

Cuestiones relacionadas