2009-03-05 54 views
2

我想知道是否有可能通過名稱而不是明確地實例化和調用委託。我認爲下面的代碼很好地解釋了它....我想接受一個函數名稱,然後基於此實例化委託。在這個例子中,我使用了一個select case,但是我想消除它,只使用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 

回答

1

如果你有一個委託的方法,你也可以這樣做:

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

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

C#,我知道,但類似將在VB中工作。

通常情況下,我會與@ BFree的答案一起去,但是在使用事件驅動反射的時候這個效果很好 - 我認爲如果調用結果委託很多次,這會稍微快一點。

0

爲什麼不使用哈希表來代替SELECT語句的?

5

我不會完全回答問題,因爲我不確定你問的是否可能。通過Reflection,儘管可能是通過調用方法名稱來調用方法。 IE:

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

+1和正確的,我會刪除我的 – ybo 2009-03-05 18:47:49

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