Das Snippet passt nicht sehr gut zur Frage. Es hat einen seltsamen Fehler, die Ereignisse in den Klassen sind nicht Shared
deklariert, so dass der Code eine ordnungsgemäße Objektreferenz verwenden muss. Kein Typname. Vielleicht ist die Antwort so einfach wie:
Private obj1 As myclass1
Private obj2 As myclass2
Sub somefunction(select as integer)
If select = 1 Then
AddHandler obj1.event1, AddressOf eventhappened
Else
AddHandler obj2.event1, AddressOf eventhappened
End If
End Sub
Aber vermutlich die eigentliche Frage ist das gleiche Szenario, aber jetzt sind die Variablen deklariert als:
Private obj1, obj2
Untypisierte und damit Object
. Ja, VB.NET unterstützt das nicht. Wie bei den meisten Macken in VB.NET gibt es Geschichte dahinter. VB unterstützte niemals die explizite späte Bindung von Ereignissen, nur Methoden und Eigenschaften. Das Schema in den alten Versionen war sehr eigenartig. Sie mussten die Variable mit dem Schlüsselwort WithEvents
deklarieren und einen spezifischen Namen für den Event-Handler auswählen. Mit anderen Worten:
Dim WithEvents obj1
Sub obj1_somethinghappened
'' handles the event1 event for obj1
End Sub
Oder um es anders auszudrücken, alle Ereignisse waren spät gebunden. Dieses Schema wurde nicht in VB.NET übernommen, zu viele praktische Probleme damit. WithEvents
überlebt weiterhin, erfordert jetzt jedoch das Schlüsselwort Handles
in der Methodendeklaration. Das macht nicht, was du willst.
Die VB.NET-Designer hinzugefügt absichtlich keine späte Bindung Unterstützung der AddHandler
-Anweisung. Ich weiß nicht genau, warum sie das entschieden haben und können nur raten. Es gibt keinen technischen Grund, warum es nicht hinzugefügt werden könnte, es erfordert lediglich, dass der Compiler einen Reflexionscode generiert. Eine mögliche Erklärung ist, dass sie es für zu teuer hielten. Ein anderes ist, dass sie die Laufzeitausnahmen betrachteten, die ausgelöst werden, wenn ein Methodensignatur-Mismatch zu schwer zu interpretieren ist. Ich mag das letzte am besten, sie sind furchtbar hässlich.
Sie müssen Reflection verwenden, um zu bekommen, was Sie wollen. Verwenden Sie obj1.GetType(). GetEvent ("event1"), um die EventInfo abzurufen, und Get/AddMethod(), um den Ereignishandler hinzuzufügen.
Fwiw, die C# -Sprache unterstützt dies in seiner dynamischen Schlüsselwort-Implementierung. Vielleicht können Sie einen Bug in ihr Ohr von asking for the feature setzen.Keine echte Idee, wenn dies vorher beantragt wurde.
Was ist mit Gießen kombiniert mit 'GetType()' Vergleich? Oder erstellen Sie eine Basisklasse, von der die anderen Klassen abgeleitet sind, wobei die Basisklasse das Ereignis enthält. Dann können Sie einfach in die Basisklasse umwandeln. –