Wie kann ich beim Debuggen ganz einfach die Anzahl der Ereignisabonnements sehen?
-
20-12-2019 - |
Frage
Kann ich beim Debuggen einen Blick darauf werfen? textBox1.TextChanged
um die Anzahl der Veranstaltungsabonnements zu sehen?Wenn ja, wie kann ich dann darauf zugreifen?Ich muss wissen, wie viele Abonnements zu einem bestimmten Zeitpunkt zum Debuggen vorhanden sind, da es so aussieht, als würde ein Ereignis mehrmals ausgelöst, aber ich vermute, dass dieser Fehler tatsächlich daran liegt textBox1.TextChanged += handler
wird in der Anwendung falsch verwaltet, sodass es zu viele Abonnenten gibt.
Hier ist eine vereinfachte Version dessen, was meiner Meinung nach passiert.Wenn möglich, möchte ich einfach einen Haltepunkt setzen und die Anzahl der Abonnements für „textBox1.TextChanged“ hochzählen:
private void textBox1_TextChanged(object sender, EventArgs e)
{
textBox1.TextChanged += textBox1_TextChanged;
MessageBox.Show("asdf");
textBox1.TextChanged -= textBox1_TextChanged;
textBox1.Text = DateTime.Now.ToString();
textBox1.TextChanged += textBox1_TextChanged;
}
Ist das möglich oder ist es komplizierter?
Lösung
Sie müssen Reflection verwenden, um zur Aufrufliste des Ereignisdelegierten zu gelangen:
textBox1.TextChanged += textBox1_TextChanged;
MessageBox.Show("asdf");
textBox1.TextChanged -= textBox1_TextChanged;
textBox1.Text = DateTime.Now.ToString();
textBox1.TextChanged += textBox1_TextChanged;
var eventField = textBox1.GetType().GetField("TextChanged", BindingFlags.GetField
| BindingFlags.NonPublic
| BindingFlags.Instance);
var subscriberCount = ((EventHandler)eventField.GetValue(textBox1))
.GetInvocationList().Length;
Andere Tipps
Wenn es Ihnen nur darum geht, dies unter dem Debugger und nicht programmgesteuert zu tun, dann ist dies möglicherweise eine einfachere, nicht-invasive Methode:
class _24003458
{
event EventHandler MyEvent;
public void Test()
{
MyEvent += Handler1;
MyEvent += Handler2;
MyEvent(this, EventArgs.Empty);
}
void Handler1(object sender, EventArgs e)
{
throw new NotImplementedException();
}
void Handler2(object sender, EventArgs e)
{
throw new NotImplementedException();
}
}
Setzen Sie einen Haltepunkt auf einen der Ereignishandler, und sehen Sie sich die Registerkarte „Lokal“ an, wenn er unterbrochen wird.Wenn das Ereignis erweitert wird, werden die Aufrufanzahl und die Ereignishandler angezeigt:
Sie können eine Mitgliedsmethode erstellen, die Sie dem Objekt hinzufügen, das die implementiert INotifyPropertyChanged
Schnittstelle.Es macht das Debuggen sehr einfach:
#if DEBUG
public System.Delegate[] GetInvocationList()
{
return PropertyChanged?.GetInvocationList();
}
#endif