Sin duda es posible lograr lo que quiere hacer, pero no se ajusta a las convenciones. Le insto a que encuentre una solución diferente que no implique eventos.
As explained by Jon Skeet, los eventos públicos son envoltorios similares a propiedades alrededor de un delegado de multidifusión.
Puede pensar en la implementación estándar de un evento como una lista de funciones que se invocarán cuando algo suceda.
// From the above link:
// the exposed event
public event EventHandler MyEvent
// multicast delegate field
private EventHandler _myEvent;
// property-like add & remove handlers
public event EventHandler MyEvent
{
add
{
lock (this)
{
_myEvent += value;
}
}
remove
{
lock (this)
{
_myEvent -= value;
}
}
}
... cuando un desarrollador ve tal evento, que esperan ser capaces de suscribirse a él sin ningún problema como un evento básicamente dice "cualquier número de tipos puede registrarse para recibir esta notificación de eventos".
Parece que quiere permitir que alguien establezca la implementación que obtiene la lista de ventanas. Lo que sugiero hacer es permitir que las personas pasen manualmente un delegado, y luego mantener una única instancia delegado. Haga explícito que solo hay una forma de establecerlo; de ser posible, recomendaría usar la inyección de constructor, ya que elimina toda ambigüedad; solo puede establecer la instancia de delegado una vez en la construcción, y la API pública ya no puede modificarla (para que la clase B no pueda vencer al delegado que ya estaba configurado) por clase A).
E.g.
public class CallsDelegateToDoSomething
{
private Func<List<IBaseWindow>> m_windowLister;
public CallsDelegateToDoSomething(Func<List<IBaseWindow>> windowFunc)
{
m_windowLister = windowFunc;
}
public List<IBaseWindow> GetWindowList()
{
if (windowLister == null)
{
return new List<IBaseWindow>();
}
return m_windowLister();
}
}
Si el diseño no permite esto, entonces basta con crear SetWindowLister(Func<List<IBaseWindow>> windowLister)
y ClearWindowLister()
métodos en su lugar.
Lo siento pero no entiendo lo suficiente a los delegados como para saber a qué se refiere ... mi comprensión de los delegados se limita a su uso con los eventos. Tal vez eso ha limitado la forma en que me estoy acercando a este problema. ¿Podría dar un ejemplo mientras voy y leo a los delegados? – InvertedAcceleration
No hay nada difícil de entender, solo elimine la palabra clave 'event', y" suscríbase "con = en vez de + = –
AFAIK todos los delegados en .NET son por defecto delegados de transmisión múltiple, es decir, pueden tener múltiples" suscriptores ". – dtb