.net - VB.Net - 将处理程序添加到未知类型的对象?

标签 .net wpf vb.net events types

我正在尝试创建一个可以获取对象并为其添加大量事件处理程序的 Sub,但该对象可以是所有具有这些事件的 N 类型中的任何一种。我怎样才能做到这一点?如果我只是将它作为一个对象,如下所示 AddHandler 提示该事件对于对象不存在。

这可以做到吗?

Sub addHandlers(ByVal inputObject as object)
    AddHandler inputObject.MouseDown, AddressOf HandleClick
    AddHandler inputObject.MouseUp, AddressOf HandleMouseUp
End Sub

编辑:这些对象中的每一个都是一个类的实例,该类继承了已经具有这些事件的不同类(通常是控件)。

谢谢你的帮助,
山姆。

最佳答案

您可能只想制作 inputObject具有所有这些成员的类型。例如,如果您使用 WinForms,它将是 Control:

Sub addHandlers(ByVal inputObject As Control)
    AddHandler inputObject.MouseDown, AddressOf HandleClick
    AddHandler inputObject.MouseUp, AddressOf HandleMouseUp
End Sub

或者如果是 WPF,请使用 UIElement :
Sub addHandlers(ByVal inputObject As UIElement)
    AddHandler inputObject.MouseDown, AddressOf HandleClick
    AddHandler inputObject.MouseUp, AddressOf HandleMouseUp
End Sub

现在任何该类型的控件都可以传递到 addHandlers .

编辑 :

如果它们之间没有共同的类型,则可以使用反射:
Sub addHandlers(ByVal inputObject As Object)
    Dim type = inputObject.GetType()
    Dim handleClickDel = New MouseEventHandler(AddressOf HandleClick)
    Dim handleUpDel = New MouseEventHandler(AddressOf HandleMouseUp)
    type.GetEvent("MouseDown").AddEventHandler(inputObject, handleClickDel)
    type.GetEvent("MouseUp").AddEventHandler(inputObject, handleUpDel)
End Sub

委托(delegate)类型仍然必须匹配。不过,这对我来说有点笨拙。如果可能,尝试为 addHandlers 创建不同的重载根据需要,并使用基本类型来避免创建其中的许多。如果拥有可以作为 inputOjbect 传入的类型的代码,使用接口(interface)。

关于.net - VB.Net - 将处理程序添加到未知类型的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8565671/

相关文章:

c# - 如何以编程方式将 "require a password on wakeup"上的值更改为 false?

c# - 如何让WPF UI 的滑动动画更加有形?

c# - 如何在运行时在按钮中存储值?

vb.net - 获取目录中的所有文件夹和子文件夹

database - 有人可以检查一下我的 VB.net 代码吗?问题解释如下

.net - 使用属性的方法分析

c# - 为什么静态类不能实现接口(interface)?

wpf - 为什么在使用 MSBuild 4.0 编译 .NET3.5 项目时出现 BadImageFormatException

c# - 为什么 .net 在分配给日期字段时将此日期解释为前一天?

c# - 了解 C# 中具有 "ContinueWith"行为的异步/等待与等待