2010-04-29 3 views
5

C'è un modo in vb.net per creare un sotto/funzione che assuma come argomento una sorta di puntatore a un'altra funzione e consenti questo nuovo sub/funzione per eseguire la funzione passata?Funzione VB.NET che accetta altre funzioni come parametro e le esegue

Che cosa sono le funzioni 10-12 xml-rpc Sto chiamando contro un server remoto. Ognuna di queste funzioni ha liste di argomenti diverse (una prende 1 stringa, un'altra può prendere 3 stringhe e una int, ecc.). Tutti loro restituiscono un oggetto.

Come sto chiamando questi, sembra che dovrebbe essere in grado di essere fattorizzato meglio. Per esempio, ogni volta che chiamare una di queste funzioni, voglio provare il valore di ritorno per una caduta della sessione, e fare qualcosa per cercare di ricollegare al sistema remoto, ecc

Utilizzando NET 3.5

Grazie !

-R

risposta

3
+0

Ho modificato la tua risposta per renderla più chiara ad altre persone [rivedendolo] (http://stackoverflow.com/review/low-quality-posts/11760430) nella coda di revisione che non è una risposta di solo collegamento. –

+0

FWIW, penso che il gioco di parole in [la risposta che è arrivata dopo il tuo] (http://stackoverflow.com/a/2734209/1364007) che ha funzionalmente lo stesso contenuto probabilmente non garantisce gli 11 innaloveri extra che ottiene il tuo. –

4
Public Sub DoSomething(outerFunction as Func(of T)) 
    ' do something 

    ' call passed in function 
    Dim value = outerFunction 
End Sub 
1

Dopo un po' più ricerca, mi si avvicinò con una soluzione:

Utilizzo della funzione CallByName:

MSDN reference

Questo mi ha permesso di avere una funzione che in realtà correva le 12 funzioni individuali, e mi ha permesso di avere un sistema di gestione degli errori centralizzato:

Private Function RunRemoteRequest(ByVal functionName As String, ByVal service_url As String, ByVal args() As Object) As Object 
    Dim retnVal As Object 

    Dim success As Boolean = False 
    While success = False And Me._connAttemptCount < MAX_ATTEMPTS 
     Try 
      retnVal = CallByName(remProxy, functionName, Method, args) 
      success = True 
      Me._connAttemptCount = 0 
     Catch ex As Exception 
      Me._connAttemptCount += 1 
      If ex.Message = "Error I am looking for" Then 
       Me.Login() 
      Else 
       log.Error("Error in RunRemoteRequest(" & functionName & ").", ex) 
      End If 
     End Try 
    End While 

    RunRemoteRequest = retnVal 

End Function 

Si noti che è necessario avere Imports Microsoft.VisualBasic. CallType nel modulo/classe su cui stai lavorando.