parameterlose Methode als EventHandler registrieren

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    parameterlose Methode als EventHandler registrieren

    Hallo zusammen.

    Ich möchte eine parameterlose Methode als EventHandler für ein Button.Click-Event registrieren. Das kann ich "fest verdrahtet" so machen, obwohl EventHandler-Signatur und Methodensignatur nicht übereinstimmen:

    VB.NET-Quellcode

    1. Private Sub Button1_Click() Handles Button1.Click
    2. End Sub

    Wenn ich im WinForms-Designer die Button-Property GenerateMember auf False schalte, wird die Handles-Klausel entfernt und in der Form.Designer.vb erscheint die Zeile AddHandler Button1.Click, AddressOf Button1_Click. Nun aber meckert der Compiler, dass das aufgrund von Methodensignatur-Inkompatibilität nicht klappt. Mein eigentliches Ziel ist es, die Verknüpfung von Event und parameterloser Methode zur Laufzeit zu erstellen, scheitere aber bisher. Mit kompatiblen Signaturen klappt es, siehe folgendes Beispiel. Das Ganze soll später in eine DLL, daher mein Vorhaben.

    VB.NET-Quellcode

    1. Dim EventInfo = Button1.GetType.GetEvent("Click")
    2. Dim EventHandler = [Delegate].CreateDelegate(EventInfo.EventHandlerType, Me, NameOf(Button1_Click))
    3. EventInfo.AddEventHandler(Button1, EventHandler)

    Wieso ist die parameterlose, festverdrahtete Variante in Ordnung und wie bekomm ich diese Verdrahtung dynamisch ebenfalls hin.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Deswegen benutze ich C#, VB ist sehr sehr undurchsichtig :D ILSpy ist hier dein Freund. Der Compiler generiert nämlich eine zusätzliche Methode, welche mit der Signatur übereinstimmt.

    C#-Quellcode

    1. namespace bla
    2. {
    3. [DesignerGenerated]
    4. public class Form1 : Form
    5. {
    6. private void Button1_Click()
    7. {
    8. }
    9. [DebuggerHidden, CompilerGenerated]
    10. private void _Lambda$__R7-1(object a0, EventArgs a1)
    11. {
    12. this.Button1_Click();
    13. }
    14. }
    15. }
    Diese Schlawiner! ;)
    Ich sehe, ich wende zu selten ILSpy oder die VS-Dekompilierfunktion auf meine eigenen Programme an.
    Vielen Dank. Mit der Rätsellösung bin ich auf die Problemlösung gekommen. Ich nehme einen Dummy-EventHandler her, den ich problemlos mit der generischen Post#1-Methode an das Event binde und rufe von dort aus meine parameterlose Methode auf.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.