我有一個方法,將一組操作作爲參數。此數組中的操作始終需要1個參數,但參數類型可能不同。如何查找Action的參數類型(使用反射)?
該方法應該在調用之前檢查一個動作需要的參數類型。如果它需要String
,參數將是"text"
。如果需要Integer
,則該參數將爲123
。
這是我已經試過:
Sub MethodA(ParamArray actions() As Action(Of Object))
For Each action() As Action(Of Object) In actions
If action.Method.GetParameters()(0).ParameterType = GetType(String) Then
action("text")
ElseIf action.Method.GetParameters()(0).ParameterType = GetType(Integer) Then
action(123)
ElseIf ...
' You get the point.
End If
Next
End Sub
然而,action.Method.GetParameters()(0).ParameterType
總是Object
,可能是因爲MethodA
參數數組只需要Action(Of Object)
。
由於我的代碼不起作用,我還能嘗試什麼?我如何才能找到真的需要什麼類型的動作?
注意:我可以用Try ... Catch
,但我想,以確定哪些參數類型需要不調用方法。
編輯:我發現的Action(Of T)
和AddressOf
行爲我不明白,而且它可能涉及到我的問題。請參閱以下代碼片段:
Sub MyStringMethod(s As String)
' Do something
End Sub
MethodA(AddressOf MyStringMethod) ' Compiles
Dim stringAction As Action(Of String) = AddressOf MyStringMethod
MethodA(stringAction) 'Does not compile
這裏有什麼不同? AddressOf
是否生成Action(Of Object)
?
你還能嘗試什麼?回到繪圖板並檢查這是否是解決您嘗試解決的任何問題的最佳方法。 – Jamiec
@Jamiec:我知道我在寫不乾淨的代碼,但不幸的是我正在設計一個設計不佳的庫。我上面解釋的似乎是解決我的問題的唯一可能性。 –
@ L.B:是的,但這並不能解決我的問題。如果我沒有檢查參數類型並調用'Invoke',那麼當我使用錯誤的參數類型時,我會得到一個exeption,這正是我想要避免的。 –