我想有一個函數可以「包裝」任何其他函數調用。在這種特殊情況下,它將允許我圍繞某些特定操作編寫一些更通用的事務處理。在dotnet中使用泛型來處理任意數量參數的函數?
我可以寫這對於任何特定數量的參數,例如對於一個參數:
Public Shared Sub WrapFunc(Of T)(ByVal f As Action(Of T), ByVal arg As T)
' Test some stuff, start transaction
f(arg)
' Test some stuff, end transaction
End Sub
...但我希望能有這樣的處理任何數量的參數,而無需有重複碼0指定參數時,1對阿根廷,2個ARGS等
有一個這樣做的方式?
[編輯]感謝羅伯特·弗雷澤的C#代碼。作爲參考,這裏有一個翻譯到VB:
[EDIT2]更正後的代碼。不幸的是,在vb中似乎沒有獨立的「ActAsFunc」函數。從好的一面來看,那些使用封閉裝置的人是隱藏的,封閉裝置可以重複使用。
Public Shared Sub WrapFunc(ByVal f As Action)
_WrapFunc(f)
End Sub
Public Shared Sub WrapFunc(Of T1)(ByVal f As Action(Of T1), ByVal arg1 As T1)
_WrapFunc(Closure(f, arg1))
End Sub
Public Shared Sub WrapFunc(Of T1, T2)(ByVal f As Action(Of T1, T2), ByVal arg1 As T1, ByVal arg2 As T2)
_WrapFunc(Closure(f, arg1, arg2))
End Sub
Private Shared Sub _WrapFunc(ByVal f As Action)
' Test some stuff, start transaction
f()
' Test some stuff, end transaction
End Sub
Private Shared Function Closure(Of T1)(ByVal f As Action(Of T1), ByVal arg1 As T1) As Action
Return New Action(Function() _ActAsFunc(f, arg1))
End Function
Private Shared Function Closure(Of T1, T2)(ByVal f As Action(Of T1, T2), ByVal arg1 As T1, ByVal arg2 As T2) As Action
Return New Action(Function() _ActAsFunc(f, arg1, arg2))
End Function
Private Shared Function _ActAsFunc(Of T1)(ByVal f As Action(Of T1), ByVal arg1 As T1) As Object
f(arg1) : Return Nothing
End Function
Private Shared Function _ActAsFunc(Of T1, T2)(ByVal f As Action(Of T1, T2), ByVal arg1 As T1, ByVal arg2 As T2) As Object
f(arg1, arg2) : Return Nothing
End Function
在困擾我暫時關閉關閉時遇到困難,但這看起來非常有希望!如果它們都是一行,我不介意做單獨的函數聲明。我一定會進一步研究這一點。 – Zarigani 2010-04-21 22:23:08
經過我最初的誤解,認爲「閉包」是某種內置的,我在將「return()=> action(p1)」翻譯成vb時遇到了一個死衚衕。根據文檔,「Visual Basic要求lambda表達式返回一個值,因此,Action委託不能與Visual Basic中的lambda表達式一起使用。」 沒有這封閉措辭可以措辭? – Zarigani 2010-04-21 23:12:39
找到了解決辦法。謝謝你的幫助。 – Zarigani 2010-04-21 23:47:18