При любом типе делегата можно довольно легко написать класс, который будет объединять делегаты, принадлежащие либо к этому типу, либо к производному типу, и получит комбинированный делегат, который будет делать практически все, что может сделать MulticastDelegate
, и число.вещей, которые он не может.Единственное, что не смог бы сделать стиль объединенного делегата, - это удалить его подкомпоненты Delegate.Remove
(поскольку эта функция будет рассматривать объединенный делегат как единое целое).В отличие от MulticastDelegate, объединенный делегат сможет включать производные типы делегатов и будет отлично работать в местах, где требуется только одна цель.
В vb.net код будет выглядеть примерно так:
Class DoubleAction(Of T)
Private _Act1, _Act2 As Action(Of T)
Private Sub New(ByVal Act1 As Action(Of T), ByVal Act2 As Action(Of T))
_Act1 = Act1
_Act2 = Act2
End Sub
Private Sub Invoke(ByVal Param As T)
_Act1(Param)
_Act2(Param)
End Sub
Function Combine(ByVal Act1 As Action(Of T), ByVal Act2 As Action(Of T)) As Action(Of T)
Dim newAct As New DoubleAction(Of T)(Act1, Act2)
Return AddressOf newAct.Invoke
End Function
End Class
Перевод на C # должен быть простым.
Единственная реальная проблема с этим подходом для объединения делегатов состоит в том, что шаблонный код требуется для поддержки каждого общего семейства делегатов (так как .net не позволяетделегаты для использования в качестве параметров универсального типа).