-
Notifications
You must be signed in to change notification settings - Fork 12
Description
The converter has serious issues with custom events. For example, this code:
private static event SmallBasicCallback _buttonClicked;
/// <summary>
/// Raises an event when any button control is clicked.
/// </summary>
public static event SmallBasicCallback ButtonClicked
{
add
{
Controls._buttonClicked = null;
_buttonClicked += value;
}
remove
{
_buttonClicked -= value;
}
}is converted to:
Private Shared Event _buttonClicked As SmallBasicCallback
''' <summary>
''' Raises an event when any button control is clicked.
''' </summary>
Public Shared Custom Event ButtonClicked As SmallBasicCallback
AddHandler(Value As SmallBasicCallback)
Controls._buttonClicked = Nothing
_buttonClicked += value
End AddHandler
RemoveHandler(Value As SmallBasicCallback)
_buttonClicked -= value
End RemoveHandler
RaiseEvent(sender As Object, e As EventArgs)
End RaiseEvent
End EventWhich has many errors:
Controls._buttonClicked = Nothing_buttonClicked += value_buttonClicked -= valueRaiseEvent(sender As Object, e As EventArgs)
and there is a related error when using this code to raise the event in another place:
5. Controls._buttonClicked?.Invoke()
The correct code should be:
Private Shared _buttonClicked As new EventHandlerList
''' <summary>
''' Raises an event when any button control is clicked.
''' </summary>
Public Shared Custom Event ButtonClicked As SmallBasicCallback
AddHandler(Value As SmallBasicCallback)
Dim h = TryCast(_buttonClicked("ButtonClicked"), SmallBasicCallback)
If h IsNot Nothing Then _buttonClicked.RemoveHandler("ButtonClicked", h)
_buttonClicked.AddHandler("ButtonClicked", Value)
End AddHandler
RemoveHandler(Value As SmallBasicCallback)
_buttonClicked.RemoveHandler("ButtonClicked", Value)
End RemoveHandler
RaiseEvent()
Dim h = TryCast(_buttonClicked("ButtonClicked"), SmallBasicCallback)
If h IsNot Nothing Then h.Invoke()
End RaiseEvent
End Eventand to raise the event:
'RaiseEvent ButtonClicked()'
Note: we use ButtonClicked not _buttonClicked, becuae I changed it from event to EventHandlerList. C# can set the event to null, but VB can't, and we must do it through the EventHandlerList.
Note: you can use one EventHandlerList to deal with all events in the class, as long as each event has a unique key. Say:
Private Shared Events As EventHandlerList
This is an example:
Class Foo
Private Events As new EventHandlerList
Public Custom Event KeyDown As SmallBasicCallback
AddHandler(Value As SmallBasicCallback)
Dim Key = NameOf(KeyDown)
Dim h = TryCast(Events(Key), SmallBasicCallback)
If h IsNot Nothing Then Events.RemoveHandler(Key, h)
Events.AddHandler(Key, Value)
End AddHandler
RemoveHandler(Value As SmallBasicCallback)
Events.RemoveHandler(NameOf(KeyDown), Value)
End RemoveHandler
RaiseEvent()
Dim h = TryCast(Events(NameOf(KeyDown)), SmallBasicCallback)
If h IsNot Nothing Then h.Invoke()
End RaiseEvent
End Event
Public Custom Event KeyUp As SmallBasicCallback
AddHandler(Value As SmallBasicCallback)
Dim Key = NameOf(KeyUp)
Dim h = TryCast(Events(Key), SmallBasicCallback)
If h IsNot Nothing Then Events.RemoveHandler(Key, h)
Events.AddHandler(Key, Value)
End AddHandler
RemoveHandler(Value As SmallBasicCallback)
Events.RemoveHandler(NameOf(KeyUp), Value)
End RemoveHandler
RaiseEvent()
Dim h = TryCast(Events(NameOf(KeyUp)), SmallBasicCallback)
If h IsNot Nothing Then h.Invoke()
End RaiseEvent
End Event
End ClassNote that that this part in the AddHandler:
Dim h = TryCast(Events(Key), SmallBasicCallback)
If h IsNot Nothing Then Events.RemoveHandler(Key, h)is not necessary unless C# sets the event to null. In my code, each event will have only one handler, but this is not the generic case, so, it there is no _event = bull in C#, omit this part.