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?

War es hilfreich?

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:

Screenshot of program stopped at breakpoint and Locals window showing the expanded event with invocation count and handlers

Bei einer solchen Veranstaltung ist das allerdings (aus gutem Grund) nicht möglich, es ist durch Reflexion als möglich Selman22 sagt, über) Wenn Sie ein Ereignis direkt verwenden, können Sie Folgendes tun:

private event EventHandler handler;

var delegates = handler.GetInvocationList();

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top