Передача AddressOf функции в VB.NET для использования AddHandler

Мне нужно передать ссылку на функцию другой функции в VB.NET. Как это может быть сделано?

Моя функция должна использовать AddHandler внутри, для чего мне нужно передать ей функцию обработки. Мой код ниже явно не работает, но он передает идею того, что мне нужно.

Public Function CreateMenuItem(ByVal Name As String, ByRef Func As AddressOf ) As MenuItem
   Dim item As New MenuItem

   item.Name = Name
   'item.  other options

   AddHandler item.Click, AddressOf Func

   Return item
End Function

Есть ли другой способ сделать это? AddHandler должен быть каким-то образом установлен в переданный параметр в функции...


person DieSlower    schedule 24.05.2013    source источник
comment
Addressof возвращает делегата. Поэтому ваша функция должна принимать данный делегат в качестве типа параметра.   -  person asawyer    schedule 24.05.2013


Ответы (3)


Делегат функции — это именно то, что вам нужно для этого. Сначала вам нужно определить делегат где-то в классе. Измените подпись, чтобы она соответствовала вашему событию, конечно.

Public Delegate Sub MyDelegate(sender As System.Object, e As System.EventArgs)

Ваша функция примет делегат в качестве аргумента.

Public Function CreateMenuItem(ByVal Name As String, del As MyDelegate) As MenuItem
  ''''
  AddHandler item.Click, del
  ''''
End Function

Public Sub MyEventHandler(sender As System.Object, e As System.EventArgs)
  ''''
End Sub

И вот как вы вызываете функцию:

CreateMenuItem(myString, AddressOf MyEventHandler)
person Fuzhou Hu    schedule 24.05.2013
comment
Если инструкция AddHandler дает ошибку, попробуйте установить параметр del как EventHandler вместо MyDelegate в CreateMenuItem. (ссылка на решение @Janez Lukan) - person Fil; 06.08.2016

Ваш второй аргумент в функции должен иметь тип EventHandler, и тогда ваша функция будет выглядеть так:

Public Function CreateMenuItem(ByVal Name As String, ByRef Func As EventHandler) As MenuItem
    Dim item As New MenuItem

    item.Name = Name
    'item.  Other options

    AddHandler item.Click, Func

    Return item
End Function

Теперь вам нужен метод для обработки этих кликов:

Private Sub ItemClick(sender As Object, e As EventArgs)
    'Do something with that click here
End Sub

И теперь вы можете использовать эти два метода с чем-то вроде:

    Dim handler = New EventHandler(AddressOf ItemClick)
    Dim i = CreateMenuItem("My item", handler)

    i.PerformClick()
person Janez Lukan    schedule 24.05.2013

Во-первых, обработчики событий должны иметь Subs. Во-вторых, AddressOf нельзя использовать как тип. Если подпрограмма находится в том же классе, просто используйте ее имя. Если он находится в другом классе/файле, вам, возможно, придется сделать его общедоступным и/или квалифицировать его как член другого класса. Подпрограммы для предложения AddHandler должны в основном следовать шаблону:

Public/Private Sub MyHandler(sender As Object, e As EventArgs)

Если вам нужны разные подпрограммы в зависимости от имени элемента меню, вы можете использовать один обработчик и вызывать соответствующую подпрограмму в зависимости от имени элемента, вызывающего событие.

person tinstaafl    schedule 24.05.2013
comment
Правильно, я знаю, что AddressOf не может быть типом данных. Это было просто для того, чтобы передать идею. И я знаю, как использовать AddHandler. Но если, скажем, функция-обработчик находится в другом классе, а CreateMenuItem является общедоступной, как я могу передать адрес функции-обработчика из этого класса в CreateMenuItem? Каждый созданный пункт меню должен иметь отдельный обработчик. Я хочу избежать огромного переключателя или списка операторов if..else. - person DieSlower; 24.05.2013