2010-04-29 5 views
5

Y a-t-il un moyen dans vb.net de créer une sous-fonction qui prendra comme argument une sorte de pointeur vers une autre fonction, et de permettre cette nouvelle fonction? sous/fonction pour exécuter la fonction passée?Fonction VB.NET qui prend en paramètre d'autres fonctions et les exécute

Ce que j'ai sont 10-12 fonctions xml-rpc que j'appelle contre un serveur distant. Chacune de ces fonctions a des listes d'arguments différentes (l'une prend 1 chaîne, l'autre peut prendre 3 chaînes et un int, etc.). Tous retournent un objet.

Comme je les appelle, il semble qu'il devrait être capable d'être mieux factorisé. Par exemple, chaque fois que j'appelle une de ces fonctions, je veux tester la valeur de retour pour une baisse de la session, et faire quelque chose pour essayer de se reconnecter au système à distance, etc.

utilisant .net 3.5

Merci !

R

Répondre

3
+0

J'ai modifié votre réponse pour la rendre plus claire à d'autres personnes [en la consultant] (http://stackoverflow.com/review/low-quality-posts/11760430) dans la file d'attente de révision que ce n'est pas une réponse de type lien uniquement. –

+0

FWIW, je pense que le jeu de mot dans [la réponse qui est venu après le vôtre] (http://stackoverflow.com/a/2734209/1364007) qui a fonctionnellement le même contenu ne justifie probablement pas les 11 upvotes supplémentaires qu'il obtient le tiens. –

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

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

Après quelques recherches, je suis venu avec une solution:

Utilisation de la fonction CallByName:

MSDN reference

Cela m'a permis d'avoir une fonction qui a eu lieu en fait les 12 fonctions individuelles et m'a permis d'avoir un système de gestion des erreurs centralisée:

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 

Notez que vous devez avoir les importations Microsoft.VisualBasic. CallType dans le module/classe sur lequel vous travaillez.