Es ist sicherlich möglich zu erreichen, was Sie tun möchten, aber es entspricht nicht der Konvention - ich würde Sie drängen, mit einer anderen Lösung zu kommen, die keine Ereignisse beinhaltet.
As explained by Jon Skeet, öffentliche Ereignisse sind eigenschaftsähnliche Wrapper um einen Multicast-Delegaten.
Sie können sich die Standardimplementierung eines Ereignisses als eine Liste von Funktionen vorstellen, die aufgerufen werden, wenn etwas passiert.
// 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;
}
}
}
... wenn ein Entwickler, ein solches Ereignis sieht, sie erwarten, dass es ohne Ausgabe abonnieren zu können, als ein Ereignis im Grunde sagt, dass „eine beliebige Anzahl von Arten registrieren kann dieses Ereignis eine Benachrichtigung zu erhalten“.
Es scheint, dass Sie möchten, dass jemand die Implementierung festlegen kann, die die Liste der Windows erhält. Was ich vorschlagen würde, ist es, den Leuten zu erlauben, einen Delegierten manuell einzutragen, und dann eine einzelne Delegierte Instanz zu halten. Machen Sie deutlich, dass es nur eine Möglichkeit gibt, sie festzulegen. Wenn überhaupt möglich, würde ich die Verwendung von Konstruktorinjektion empfehlen, da dies alle Zweideutigkeiten beseitigt - Sie können die Delegat-Instanz nur einmal bei der Konstruktion setzen, dann ist sie nicht mehr durch die öffentliche API modifizierbar (Klasse B kann also den bereits gesetzten Delegaten nicht überlisten) nach Klasse A).
z.
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();
}
}
Wenn Ihr Design für diese nicht zulässt, dann erstellen Sie einfach SetWindowLister(Func<List<IBaseWindow>> windowLister)
und ClearWindowLister()
stattdessen Methoden.
Tut mir leid, aber ich verstehe nicht, Delegat gut genug zu wissen, was du meinst ... mein Verständnis von Delegierten ist auf ihre Verwendung mit Veranstaltungen beschränkt. Vielleicht hat das begrenzt, wie ich mich diesem Problem annähere. Können Sie mir ein Beispiel geben, während ich Delegierte lese? – InvertedAcceleration
Es gibt nichts schwierig zu verstehen, nur entfernen Sie das 'Ereignis' Schlüsselwort und" subscribe "mit = anstelle von + = –
AFAIK alle Delegaten in .NET sind standardmäßig Multi-Cast-Delegaten, d. H. Sie können mehrere" Abonnenten "haben. – dtb