Ich habe eine Basisklasse, die die folgenden Ereignisse enthält:
public event EventHandler Loading;
public event EventHandler Finished;
In einer Klasse, die von dieser Basisklasse erbt, versuche ich, das Ereignis auszulösen:
this.Loading(this, new EventHandler()); // All we care about is which object is loading.
Ich erhalte folgende Fehlermeldung:
Das Ereignis 'BaseClass.Loading' kann nur auf der linken Seite von + = oder - = (BaseClass ') angezeigt werden.
Ich gehe davon aus, dass ich nicht wie andere geerbte Mitglieder auf diese Ereignisse zugreifen kann.
c#
events
inheritance
jwarzech
quelle
quelle
Antworten:
Was Sie tun müssen, ist Folgendes:
Erstellen Sie in Ihrer Basisklasse (in der Sie die Ereignisse deklariert haben) geschützte Methoden, mit denen die Ereignisse ausgelöst werden können:
(Beachten Sie, dass Sie diese Methoden wahrscheinlich ändern sollten, um zu überprüfen, ob Sie den Eventhandler aufrufen müssen oder nicht.)
In Klassen, die von dieser Basisklasse erben, können Sie dann einfach die Methoden OnFinished oder OnLoading aufrufen, um die Ereignisse auszulösen:
quelle
Sie können nur auf ein Ereignis in der deklarierenden Klasse zugreifen, da .NET hinter den Kulissen, in denen sich der Delegat tatsächlich befindet, private Instanzvariablen erstellt. Dies tun..
macht das tatsächlich;
und das tun ...
ist eigentlich das ...
Sie können also (offensichtlich) nur innerhalb der deklarierenden Klasse auf die Instanzvariable des privaten Delegaten zugreifen.
Die Konvention sieht vor, so etwas in der deklarierenden Klasse bereitzustellen.
Sie können dann
OnMyPropertyChanged(EventArgs.Empty)
von einer beliebigen Stelle in dieser Klasse oder unterhalb der Vererbungshierarchie aufrufen, um das Ereignis aufzurufen.quelle
Genau. Es ist üblich, eine geschützte Funktion
OnXyz
oderRaiseXyz
für jedes Ereignis in der Basisklasse bereitzustellen , um das Auslösen aus geerbten Klassen zu ermöglichen. Beispielsweise:In der geerbten Klasse aufgerufen:
quelle
Sie können dies versuchen, es funktioniert für mich:
quelle
Nicht um einen alten Faden wiederzubeleben, aber falls jemand hinschaut, war das, was ich getan habe
Auf diese Weise können Sie das Ereignis in einer abgeleiteten Klasse erben, sodass Sie es aufrufen können, ohne die Methode umbrechen zu müssen, während Sie die Syntax + = beibehalten. Ich denke, Sie könnten das immer noch mit den Verpackungsmethoden tun, wenn Sie dies tun würden
quelle