Как передать параметры события событию с разными сигнатурами

#vb.net #events #plugins #event-handling

#vb.net #Мероприятия #Плагины #обработка событий

Вопрос:

Я пытаюсь создать возможности плагина для своего приложения. Как вы добавляете событие к функции, которая преобразует событие в другой тип события. Например, класс плагина содержит Sub и событие следующим образом:

 Structure ClickedEventArgs
   property ClickedTime As DateTime
   property Clicked As Boolean
End structure

Sub Clicked(sender As object, e As ClickedEventArgs)
   RaiseEvent Clicked(Sender, e)
End sub

Sub PluginLoaded
    AddHandle ClickObject.Clicked, AddressOf NewObject.Clicked
End Sub
 

newObject является ссылкой и может обрабатывать события только со следующей структурой (например, как NewObjectEventArgs), и поэтому они не могут быть обработаны AddHandled, поскольку подписи не совпадают.

 Structure NewObjectEventArgs
    Property Clicked As Boolean
    Property ClickedTime As DateTime
    Property otherInfo As Object
End Structure
 

Как мне преобразовать ClickedEventArgs в NewObjectEventArgs и AddHandle их?

Использую ли я функцию? и если да, то как мне это сделать?

Комментарии:

1. оба аргумента события должны быть классами, а не структурами, и CA понравится, если они наследуются от EventArgs. вы пытаетесь «отправить» событие, то есть перехватить A, а затем выбросить B для использования чего-то еще? Я не понимаю, что вы пытаетесь сказать … newObject просто появился в вашем сообщении из ниоткуда. Есть ли какая-либо причина, по которой вы не можете использовать правильную подпись?

2. API плагина позволяет отправлять команды в основное приложение через вспомогательный модуль, который вызывает событие. Приложение обрабатывает объект и соответствующим образом обновляет интерфейс. Интерфейс использует ссылочный компонент DevExpress. Требования компонента (отправитель как объект, e как itemclickeventargs) Я хотел бы преобразовать свой собственный интерфейс и заполнить значения в новый itemclickeventargs, который будет отправлен на событие. Пожалуйста, помогите, если можете, спасибо.

3. все еще не знаю, что такое newObject, и теперь есть пользовательский компонент. Возможно, вы могли бы подклассировать эту вещь и создать свое собственное событие. В противном случае подпишитесь на него и отправьте новое событие, как описывает Марк, вы не сможете преобразовать события или аргументы событий, поскольку подпись должна оставаться неизменной, чтобы они работали.

Ответ №1:

Вам нужно будет обрабатывать события и пересылать их в NewObject :

 Sub PluginLoaded()
    AddHandler ClickObject.Clicked,
        Sub(sender, e)
            NewObject.Clicked(
                sender,
                New NewObjectEventArgs() With {
                    .Clicked = e.Clicked,
                    .ClickedTime = e.ClickedTime,
                    .otherInfo = ??? ' leave null, or populate somehow
                }
            )
        End Sub
End Sub
 

Если в какой-то момент вам нужно удалить обработчик, вам следует создать отдельную подпрограмму вместо использования лямбда-выражения (или вы можете сделать это так, как вам больше нравится):

 Sub ClickObject_Clicked(sender As Object, e As ClickedEventArgs)
    ' Same code as above
End Sub