Pergunta

Eu estou tentando descobrir se é possível instanciar e invocar um delegado por nome, em vez de explicitamente. Eu acho que os belows código explica muito bem .... Eu quero aceitar um nome de função e, em seguida, instanciar o delegado com base nisso. No exemplo que eu uso um caso de seleção, mas eu quero eliminar isso e é só usar o argumento methodName em si.

Respeitosamente ... por favor evitar o desejo de me dizer isso é insano e eu deveria estar tomando alguma abordagem completamente diferente para isso. :)

    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

Graças Keith, exatamente o que eu estava procurando. (Abordagem de BFree iria funcionar tão bem na maioria das circunstâncias embora).

Aqui está o código de trabalho em 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
Foi útil?

Solução

Se você tem um delegado para o método que você também pode fazer isso:

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

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

C #, eu sei, mas o trabalho vontade semelhante em VB.

Normalmente eu iria com @ resposta de BFree, mas isso funciona bem quando se trabalha com evento dirigido reflexão -. Acho que isso vai ser ligeiramente mais rápido se chamando os lotes resultado delegado de vezes

Outras dicas

Eu não vou responder plenamente pergunta, porque eu não tenho certeza se o que você está pedindo é possível. O que é possível, porém, através da reflexão, é invocar um método dado o nome do método. IE:

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

Por que não usar um HashTable em vez de uma instrução SELECT?

obras

de BFree resposta ;

A minha resposta é apenas uma sugestão;

Porque não basta passar o endereço do método para InvokeMethod em vez de passar o nome do método na corda?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top