Du kannst ein Ereignis nur testen/aufrufen, wenn es sich um ein feldähnliches Ereignis handelt, das im aktuellen Typ deklariert ist. Also: Es gibt zwei Szenarien, die dies verursachen könnten:
-
Es handelt sich nicht um ein feldähnliches Ereignis, sondern hat benutzerdefinierte add
/remove
Zugriffsmethoden: In diesem Fall weiß nur Ihr benutzerdefinierter Code, wie der Delegat gespeichert ist
-
Es ist nicht im aktuellen Typ deklariert, sondern in einem Basistyp oder einem unzusammenhängenden Objekt: In diesem Fall müssen Sie den deklarierenden Typ erhalten, um das Ereignis aufzurufen, normalerweise über eine OnCustomEvent
Methode. Im Fall eines Basistyps wäre die Konvention, diese Methode als protected virtual
zu kennzeichnen, was es den Unterklassen ermöglicht, das Ereignis aufzurufen und in das Ereignis über override
einzuhaken
(Kommentare)
Es scheint, als wäre es Fall 1. jedoch verstehe ich nicht, was zu tun ist, um dieses Problem zu lösen.
Wenn Sie benutzerdefinierte add
/remove
haben, ist es implementierungsspezifisch, wie Sie sie aufrufen (Ich könnte Ihnen mehr sagen, wenn ich die add
/remove
sehen könnte), aber lassen Sie uns zwei häufige Implementierungen betrachten:
1a: ein untergeordneter Delegat:
private EventHandler someEvent;
public event EventHandler SomeEvent
{
add { someEvent += value; }
remove { someEvent -= value; }
}
In diesem Fall wäre die "Aufruf"-Implementierung einfach:
if(someEvent != null) someEvent(this, EventArgs.Empty);
Oder wenn Sie besonders vorsichtig sind:
var handler = someEvent;
if(handler != null) handler(this, EventArgs.Empty);
1b: eine EventHandlerList
(verwendet für spärliche Ereignisse):
private static readonly object SomeEventKey = new object();
public event EventHandler SomeEvent
{
add { Events.AddHandler(SomeEventKey, value); }
remove { Events.RemoveHandler(SomeEventKey, value); }
}
In diesem Fall wäre die Aufrufimplementierung:
var handler = (EventHandler)Events[SomeEventKey];
if(handler != null) handler(this, EventArgs.Empty);