2010-04-29 1 views
5

Есть ли способ в vb.net создать суб/функцию, которая примет в качестве аргумента какой-то указатель на другую функцию и позволит этому новому sub/function для выполнения переданной функции?Функция VB.NET, которая принимает другие функции в качестве параметра и выполняет их.

У меня есть функции 10-12 xml-rpc Я звоню на удаленный сервер. Каждая из этих функций имеет разные списки аргументов (одна берет 1 строку, другая может принимать 3 строки и один int и т. Д.). Все они возвращают объект.

Как я их называю, похоже, что он должен быть в состоянии быть лучше. Например, каждый раз, когда я называю любой из этих функций, я хочу, чтобы проверить возвращаемое значение для падения сеанса, и сделать что-то, чтобы попытаться восстановить соединение с удаленной системой и т.д.

Использование .net 3.5

Спасибо !

-R

ответ

3

Использование Func<in T, out TResult>

+0

Я отредактировал ваш ответ, чтобы сделать его более понятным для других людей [его просмотр] (http://stackoverflow.com/review/low-quality-posts/11760430) в очереди просмотра, что это не ответ только для ссылок. –

+0

FWIW, я думаю, что каламбур в [ответе, который пришел после вашего] (http://stackoverflow.com/a/2734209/1364007), который имеет функционально то же содержимое, вероятно, не гарантирует лишние 11 повышений, которые он получает ваша. –

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

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

После еще некоторых исследований, я придумал решение:

Использование функции CallByName:

MSDN reference

Это позволило мне иметь одну функцию, которая на самом деле управлял 12 отдельных функций, и дало мне возможность иметь централизованную систему обработки ошибок:

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 

Обратите внимание, что вам нужно иметь Imports Microsoft.VisualBasic. CallType в модуле/классе, над которым вы работаете.