سؤال

وأنا في محاولة لمعرفة ما اذا كان من الممكن مثيل واستدعاء مندوب بالاسم، وليس صراحة. أعتقد رمز يوضح بلوس جيدا إلى حد ما .... أريد أن قبول اسم الدالة، ومن ثم مثيل مندوب بناء على ذلك. في المثال يمكنني استخدام حالة مختارة، ولكن أريد أن القضاء على ذلك ومجرد استخدام الوسيطة METHODNAME نفسها.

والاحترام ... يرجى تجنب الرغبة في أن تقول لي هذا هو مجنون وأرجو أن أخذ بعض نهجا مختلفا تماما لهذا. :)

    Private Delegate Sub myDelegate()  

    Private Sub myDelegate_Implementation1()
        'Some code
    End Sub
    Private Sub myDelegate_Implementation2()
        'Some code
    End Sub

    Public Sub InvokeMethod(ByVal methodName As String)
        Dim func As myDelegate = Nothing
        '??? HOW TO GET RID OF THIS SELECT CASE BLOCK?:
        Select Case methodName
            Case "myDelegate_Implementation1"
                func = AddressOf myDelegate_Implementation1
            Case "myDelegate_Implementation2"
                func = AddressOf myDelegate_Implementation2
        End Select
        func.Invoke()
    End Sub

وبفضل كيث، بالضبط ما كنت أبحث عنه. (نهج BFree من شأنه أن تعمل بشكل جيد في معظم الحالات على الرغم من).

وهنا هو رمز العمل في VB:

Public Delegate Sub xxxDelegate()

Sub xxxAnImplementation()

End Sub

Sub zzzDoIt(ByVal xxxImplementerName As String)
    Dim theDelegate As xxxDelegate = CType(System.Delegate.CreateDelegate(GetType(xxxDelegate), Me, xxxImplementerName), xxxDelegate)
    theDelegate.Invoke()
End Sub

Private Sub LoadFunctions()
    Dim thisClass As Type = Type.GetType(Me.GetType.BaseType.FullName.ToString)
    For Each method As MethodInfo In thisClass.GetMethods(System.Reflection.BindingFlags.DeclaredOnly)
        If 1 = 1 OrElse method.Name.Substring(0, 3) = "Get" Then
            Me.ddlCodeSamples.Items.Add(method.Name)
        End If
    Next
End Sub
هل كانت مفيدة؟

المحلول

إذا كان لديك مندوب عن الطريقة التي يمكن أيضا القيام بذلك:

public delegate void MethodDelegate( ... ) ...

//create the delegate we expect
(MethodDelegate) Delegate.CreateDelegate(
    typeof( MethodDelegate ), this, "methodName", true );

وC #، وأنا أعلم، ولكن على غرار ستعمل في VB.

وعادة كنت اذهب مع @ BFree في الجواب، ولكن هذا يعمل بشكل جيد عند العمل مع الحدث يحركها التفكير - وأعتقد أن هذا سوف يكون أسرع قليلا إذا استدعاء الكثير نتيجة مندوب مرات

نصائح أخرى

ولن أجيب تماما السؤال، لأنني لست متأكدا إذا ما كنت طالبا غير ممكن. ما هو ممكن على الرغم، من خلال التأمل، هو استدعاء الأسلوب نظرا للاسم الأسلوب. IE:

    string methodName = "MyMethod";
    MethodInfo method = this.GetType().GetMethod(methodName);
    method.Invoke(this, null);

لماذا لا تستخدم جدول هاش بدلا من العبارة تحديد؟

BFree في الإجابة أعمال ؛

وجوابي هو مجرد اقتراح؛

لماذا لا مجرد تمرير عنوان طريقة لInvokeMethod بدلا من تمرير اسم الأسلوب في سلسلة؟

Module Module1
Sub Main()
    InvokeMethod(AddressOf myDelegate_Implementation1)
    InvokeMethod(AddressOf myDelegate_Implementation2)
End Sub

Public Delegate Sub myDelegate()

Private Sub myDelegate_Implementation1()
    Console.WriteLine("myDelegate_Implementation1")
End Sub
Private Sub myDelegate_Implementation2()
    Console.WriteLine("myDelegate_Implementation2")
End Sub

Public Sub InvokeMethod(ByVal func As myDelegate)
    func()
End Sub
End Module
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top