2010-05-24 31 views
5

Acabo de implementar Clone de ICloneable y me di cuenta de que también seguían las suscripciones a eventos de mi instancia fuente. ¿Hay una buena manera de borrar todos esos?Borrar todas las suscripciones a eventos (clonadas)

Actualmente estoy usando un par de estos loops para cada evento que tengo que borrar todo.

foreach (var eventhandler in OnIdChanged.GetInvocationList()) 
{ 
    OnIdChanged -= (ItemEventHandler) eventhandler; 
} 

foreach (var eventhandler in OnNameChanged.GetInvocationList()) 
{ 
    ... 

Esto funciona bien, pero desordena el código un poco. Mayormente preocupado por tener un evento colgando.

Respuesta

1

Creo que podría simplemente establecer OnIdChanged = null en su objeto clonado.

Después de haber creado el clon, simplemente llame al método ClearEvents en el clon.

public class ClonedObject 
{ 
    public event EventHandler OnIdChanged; 
    public event EventHandler OnNameChanged; 

    public void ClearEvents() 
    { 
     OnIdChanged = null; 
     OnNameChanged = null; 
    } 
} 
+0

esto funcionó, así que estoy marcando es como una respuesta. aunque estoy considerando una refactorización después de la respuesta de Randolpho – mattias

+1

@mattias, considero su pregunta y no la implicación de su solución en mi respuesta. Lo que Randolpho sugirió es probablemente mejor. –

+0

todavía ayudó en el corto plazo. ¡Gracias! – mattias

2

Es de suponer que, si realmente quería clonar un objeto, que quería mantener esas suscripciones de eventos.

Si está clonando objetos que no deberían estar suscritos a eventos, parece que debería considerar la refacturación de su código. Haga que su controlador u objetos similares se suscriban a los eventos con una referencia a un objeto de datos dedicado y haga que sus objetos de datos almacenen esos datos sin hacer referencia a los eventos; clonar los objetos de datos y colocarlos en los objetos de controlador apropiados según sea necesario.

En última instancia, sugiero que solucione el problema al no suscribirse a eventos para los cuales no necesita suscribirse. Mire el espacio del problema desde un ángulo diferente.

+1

Pensé lo mismo cuando leí la pregunta. Clone() implica que de hecho estás clonando el objeto, los eventos y todo. –

Cuestiones relacionadas