Vb.net NET钩子机制,或者如何执行方法列表?

Vb.net NET钩子机制,或者如何执行方法列表?,vb.net,Vb.net,我有一个算法“总是”按顺序运行步骤A、C、D 我想允许一种运行a、B、C、D的方法,其中B可以是多个方法。C、 D“应该”是不受影响的,但我不能将其并行化。它只是在写入一个文件 无论如何,我对委托略知一二,并使用AddressOf连接了一个事件处理程序 所以我想简单地创建一个数组或集合,而不是“地址”或委托 这可能吗 这是最好的方式吗?我知道如何强制对象的行为,但我希望重用VB、.NET中已经内置的任何机制 Dane这不是您经常看到的东西,但是您可以组合委托,以便单个委托变量在调用时调用多个函数

我有一个算法“总是”按顺序运行步骤A、C、D

我想允许一种运行a、B、C、D的方法,其中B可以是多个方法。C、 D“应该”是不受影响的,但我不能将其并行化。它只是在写入一个文件

无论如何,我对委托略知一二,并使用AddressOf连接了一个事件处理程序

所以我想简单地创建一个数组或集合,而不是“地址”或委托

这可能吗

这是最好的方式吗?我知道如何强制对象的行为,但我希望重用VB、.NET中已经内置的任何机制


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那里学习,但必须选择一个。谢谢各位。