У меня есть метод с пользовательским атрибутом, который перечисляет другие методы в том же классе, которые он может вызывать. Я передаю вызванный метод другой функции класса, которая прочитает атрибут, выберет один из методов, названных в атрибуте, и вернет его делегат. Мне трудно понять, как сделать это с помощью отражения или события, если это возможно.
<AttributeUsage(AttributeTargets.Method, allowmultiple:=False)>
Public Class ExecuteSimiliar
Inherits System.Attribute
Public ReadOnly ChildBehaviors() As String
Public Sub New(ParamArray childBehaviors() As String)
Me.ChildBehaviors = childBehaviors
End Sub
End Class
Public Class MyMethods
<ExecuteSimiliar("JellyBeanBlack", "JellyBeanRed", "JellyBeanWhite", "JellyBeanGreen")>
Public Shared Sub JellBean()
Dim myFunction As Action = ExecuteManager.Choose(AddressOf JellBean)
myFunction.Invoke()
End Sub
Public Shared Sub JellyBeanBlack()
'Do something
End Sub
Public Shared Sub JellyBeanRed()
'Do something
End Sub
Public Shared Sub JellyBeanWhite()
'Do something
End Sub
Public Shared Sub JellyBeanGreen()
'Do something
End Sub
End Class
Public Class ExecuteManager
Public Shared Function Choose(source As Action) As Action
Dim similarAttr As ExecuteSimiliar
similarAttr = CType(Attribute.GetCustomAttribute(source.Method, GetType(ExecuteSimiliar)), ExecuteSimiliar)
'Select random function name from similarAttr
'Get sibling methods from source delegate
'Return selected method delegate. (JellyBeanBlack, JellyBeanRed, JellyBeanWhite, JellyBeanGreen)
End Function
End Class
Первоначальный вызов будет выполняться в JellyBean (), и одна из функций JellyBeanBlack, JellyBeanRed, JellyBeanWhite, JellyBeanGreen будет вызываться после выбора менеджером выполнения.