Как найти методы в том же классе из переданного делегата - PullRequest
1 голос
/ 25 октября 2011

У меня есть метод с пользовательским атрибутом, который перечисляет другие методы в том же классе, которые он может вызывать. Я передаю вызванный метод другой функции класса, которая прочитает атрибут, выберет один из методов, названных в атрибуте, и вернет его делегат. Мне трудно понять, как сделать это с помощью отражения или события, если это возможно.

<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 будет вызываться после выбора менеджером выполнения.

1 Ответ

1 голос
/ 25 октября 2011

Обновлено, чтобы избежать промежуточного делегата оболочки

Мой VB ржавый, поэтому я использую C #:

var methodNames = similarAttr.ChildBehaviors;
var randomMethodStr = methodNames[new Random().Next(methodNames.Length)];
return (Action)Delegate.CreateDelegate(source.Target, randomMethodStr);

Я должен указать, что естьЗапах кода здесь: вы можете подумать , почему вы пытаетесь вызывать методы таким образом, и подумать, может ли быть лучшая практика проектирования для достижения того, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...