Guten Tag! Mein Zweck ist es, eine Klasse zu implementieren, mit der wir Objekte für (von) Ereignissen subskribieren und abmelden können. Hier ist der Code meiner Klasse.Hinzufügen und Entfernen von Ereignishandler über Reflexion C#
Wie Sie hier sehen können, sind 2 öffentliche Methoden, die tatsächlich Objekte (von) Ereignis abonnieren und abmelden. Und hier ist die Probe, wie ich es testen
class Program
{
static void Main()
{
Test test = new Test();
test.SubscribeTimer();
while (true)
{
if(test.a == 10)
{
break;
}
}
test.UnsubscribeTimer();
while (true)
{
}
}
}
class Test
{
System.Timers.Timer timer;
public int a = 0;
public Test()
{
timer = new System.Timers.Timer(1000);
timer.Start();
}
public void SubscribeTimer()
{
var eventInfo = typeof(System.Timers.Timer).GetEvent("Elapsed");
EventSubscriber.AddEventHandler(eventInfo, timer, TimerElapsed);
EventSubscriber.RemoveEventHandler(eventInfo, timer, TimerNotElapsed);
}
public void UnsubscribeTimer()
{
var eventInfo = typeof(System.Timers.Timer).GetEvent("Elapsed");
EventSubscriber.AddEventHandler(eventInfo, timer, TimerNotElapsed);
EventSubscriber.RemoveEventHandler(eventInfo, timer, TimerElapsed);
}
public void TimerElapsed()
{
Console.WriteLine("timer elapsed");
a++;
}
public void TimerNotElapsed()
{
Console.WriteLine("timer not elapsed");
a++;
}
}
Das erwartete Verhalten der Probe ist, dass auf den Anfang werden wir die Meldung „Timer abgelaufen“ jede Sekunde, nach 10-ten Sekunde sehen wir nur sehen sollte „Timer nicht abgelaufen "und wir tun, aber wir sehen immer noch" Timer abgelaufen ". Dies bedeutet, dass die AddEventHandler-Methode funktioniert, die RemoveEventHandler-Methode jedoch nicht.
Ich würde mich sehr freuen, wenn Sie mir helfen werden. Danke im Voraus.
für einen Event-Handler Um zu entfernen, muss der Delegat eine exakte Übereinstimmung sein. Gleiche Methoden- und Zieleigenschaften. Das Ziel ist nicht das Gleiche. Sehr schwer zu erkennen, das Closure-Objekt wird durch Expression.Lambda() stark verschleiert. Netter Trick, aber ich bezweifle ernsthaft, dass du es schaffen kannst. Beachten Sie außerdem, dass Sie Threading-Anforderungen verletzen. Sie können nicht davon ausgehen, dass Sie Aktualisierungen der a-Variablen sehen können. –
Danke für die Antwort! Also, wenn ich die Signatur des Event-Handlers genauso machen werde wie die Signatur des Delegate-Typs des Events, kann ich mich abmelden, wie ich es in meinem Beispiel geschrieben habe? – Crispried