9

我需要将函数的引用传递给 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 需要以某种方式设置为函数中传递的参数......

4

3 回答 3

13

函数委托正是您执行此操作所需要的。首先,您需要在类中的某处定义委托。当然,更改签名以适合您的活动。

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)
于 2013-05-24T21:45:11.530 回答
9

函数中的第二个参数应该是 type 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()
于 2013-05-24T19:56:41.093 回答
1

首先,事件处理程序必须有 Subs。其次,AddressOf不能用作类型。如果子在同一类中,只需使用子名称。如果它在另一个类/文件中,您可能必须将子公开和/或将其限定为另一个类的成员。AddHandler 子句的子句必须基本上遵循以下模式:

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

如果您需要基于菜单项名称的不同例程,您可以使用一个处理程序并根据触发事件的项的名称调用适当的例程。

于 2013-05-24T17:46:12.820 回答