我有一个方法,将一组操作作为参数。此数组中的操作始终需要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,这正是我想要避免的。 –