【问题标题】:Passing AddressOf to a function in VB.NET to use AddHandler将 AddressOf 传递给 VB.NET 中的函数以使用 AddHandler
【发布时间】:2013-05-20 08:44:13
【问题描述】:

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

【问题讨论】:

  • Addressof 返回一个委托。因此,您的函数应该接受给定的委托作为参数类型。

标签: .net vb.net addhandler addressof


【解决方案1】:

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

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

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

【讨论】:

  • 对,我知道 AddressOf 不能是数据类型。那只是为了传达这个想法。而且我知道如何使用 AddHandler。但是,如果假设处理函数在另一个类中,并且 CreateMenuItem 是公共的,我如何将处理函数的地址从该类传递给 CreateMenuItem?创建的每个菜单项都应该有一个不同的处理程序。我想避免有一个巨大的 switch 或 if..else 语句列表。
【解决方案2】:

你在函数中的第二个参数应该是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()

【讨论】:

    【解决方案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)
    

    【讨论】:

    • 如果 AddHandler 指令出错,请尝试在 CreateMenuItem 中将 'del' 参数设置为 EventHandler 而不是 MyDelegate。 (参考@Janez Lukan 解决方案)
    猜你喜欢
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多