È certamente possibile ottenere ciò che si vuole fare, ma non è conforme alle convenzioni - Vi esorto a proporre una soluzione diversa che non implichi eventi.
As explained by Jon Skeet, gli eventi pubblici sono involucri di proprietà attorno a un delegato multicast.
Si può pensare all'implementazione standard di un evento come una lista di funzioni da chiamare quando succede qualcosa.
// 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;
}
}
}
... quando uno sviluppatore vede un tale evento, si aspettano di essere in grado di iscriversi ad esso senza alcun problema come un evento in pratica dice "qualsiasi numero di tipi può registrarsi per ricevere la notifica evento".
Sembra che tu voglia consentire a qualcuno di impostare l'implementazione che ottiene l'elenco delle finestre. Quello che suggerirei di fare è consentire alle persone di passare manualmente in un delegato, quindi di tenere un'istanza delegata singola. Rendi esplicito che esiste un solo modo per impostarlo; se possibile, consiglierei di usare il constructor injection in quanto rimuove ogni ambiguità - puoi solo impostare l'istanza delegata una volta in costruzione, quindi non è più modificabile dall'API pubblica (quindi la classe B non può clobare il delegato che era già impostato per classe 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();
}
}
Se il progetto non consente questo, allora basta creare invece SetWindowLister(Func<List<IBaseWindow>> windowLister)
e ClearWindowLister()
metodi.
fonte
2010-01-16 17:50:14
Scusa ma non capisco abbastanza bene il delegato per sapere cosa intendi ... la mia comprensione dei delegati è limitata al loro uso con gli eventi. Forse questo ha limitato il modo in cui mi sto avvicinando a questo problema. Potresti fornire un esempio mentre vado a leggere i delegati? – InvertedAcceleration
Non c'è niente di difficile da capire, basta rimuovere la parola chiave 'event' e" subscribe "con = invece di + = –
AFAIK tutti i delegati in .NET sono di default delegati multi-cast, cioè possono avere più" sottoscrittori ". – dtb