Vb.net NET钩子机制,或者如何执行方法列表?
我有一个算法“总是”按顺序运行步骤A、C、D 我想允许一种运行a、B、C、D的方法,其中B可以是多个方法。C、 D“应该”是不受影响的,但我不能将其并行化。它只是在写入一个文件 无论如何,我对委托略知一二,并使用AddressOf连接了一个事件处理程序 所以我想简单地创建一个数组或集合,而不是“地址”或委托 这可能吗 这是最好的方式吗?我知道如何强制对象的行为,但我希望重用VB、.NET中已经内置的任何机制Vb.net NET钩子机制,或者如何执行方法列表?,vb.net,Vb.net,我有一个算法“总是”按顺序运行步骤A、C、D 我想允许一种运行a、B、C、D的方法,其中B可以是多个方法。C、 D“应该”是不受影响的,但我不能将其并行化。它只是在写入一个文件 无论如何,我对委托略知一二,并使用AddressOf连接了一个事件处理程序 所以我想简单地创建一个数组或集合,而不是“地址”或委托 这可能吗 这是最好的方式吗?我知道如何强制对象的行为,但我希望重用VB、.NET中已经内置的任何机制 Dane这不是您经常看到的东西,但是您可以组合委托,以便单个委托变量在调用时调用多个函数
Dane这不是您经常看到的东西,但是您可以组合委托,以便单个委托变量在调用时调用多个函数
Dim midAction As Action(Of String) = AddressOf Console.WriteLine
Dim m1 As New IO.StreamWriter(New IO.MemoryStream())
m1.AutoFlush = True
Dim m2 As New IO.StreamWriter(New IO.MemoryStream())
midAction = CType([Delegate].Combine(New Action(Of String)(AddressOf Console.WriteLine),
New Action(Of String)(AddressOf m1.WriteLine),
New Action(Of String)(Sub(s)
m2.WriteLine(s)
m2.Flush()
End Sub)),
Action(Of String))
midAction("test")
这里最令人沮丧的是,Delegate.Combine的无类型性使得所有的铸造都是必要的
委托的IEnumerable
也会起作用,并且更强烈地表示您希望调用多个函数
根据您的描述,我认为我应该坚持使用单个委托参数,因为它似乎更符合参数的语义。调用方可以在中间有多个需要调用的函数时进行组合。< P>可以简单地使用一个事件来存储和调用多个方法。事件基本上是精简的多播委托,因此您不必使用Delegate.Combine
。缺点是你的方法不能有返回类型
这里还有一种使用多播代理的替代方法。本例假设您希望从方法返回一个值。如果你不需要这个,你就不必循环使用这些方法;您可以使用myMethods.Invoke
'the methods will be stored here
Private _MyMethods As [Delegate]
'this is here to show the signature of the methods
Public Delegate Function MyMethod(ByVal input As String) As String
Public Sub AddMethod(ByVal method As MyMethod)
_MyMethods = [Delegate].Combine(_MyMethods, method)
End Sub
Public Sub RemoveMethod(ByVal method As MyMethod)
_MyMethods = [Delegate].Remove(_MyMethods, method)
End Sub
Public Sub InvokeMethods(ByVal input As String)
If _MyMethods Is Nothing Then Return
Dim myMethods As MyMethod = DirectCast(_MyMethods, MyMethod)
'since you'll want the return value of each methods, loop through the methods
For Each method As MyMethod In myMethods.GetInvocationList()
Dim value As String = method.Invoke(input)
'TODO: something with the value
Next
End Sub
作为上述调用代码的另一种替代方法,您可以使用Delegate.DynamicInvoke
方法不必强制转换委托。但是,这将使用后期绑定,并且在函数的情况下,无论如何都需要强制转换返回值。从Gideon Engelberth和Timiz0r那里学习,但必须选择一个。谢谢各位。