可以通过名称实例化和调用委托吗?

时间:2009-03-05 18:36:35

标签: .net vb.net delegates

我试图弄清楚是否可以通过名称实例化和调用委托,而不是显式。我认为下面的代码解释得相当好....我想接受一个函数名,然后基于它实例化委托。在示例中,我使用了一个选择案例,但我想要消除它,只需使用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

4 个答案:

答案 0 :(得分:5)

我不会完全回答问题,因为我不确定你问的是否可能。但是,通过Reflection,可以调用给定方法名称的方法。 IE:

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

答案 1 :(得分:1)

如果您拥有该方法的代理人,您也可以这样做:

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

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

C#,我知道,但类似的将在VB中运行。

通常情况下我会选择@BBree的答案,但是在使用事件驱动的反射时这很有效 - 我认为如果多次调用结果委托,这会稍快一些。

答案 2 :(得分:0)

为什么不使用HashTable而不是Select语句?

答案 3 :(得分:0)

BFree's answer有效;

我的回答只是一个建议;

为什么不直接将方法的地址传递给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