我有这个功能:
Public Sub DoStuff(ByVal type as System.Type, ByVal value as Object)
End Sub
'value'参数始终是与'type'相同类型的数组。如何循环遍历数组的值?
我希望能够做到这样的事情:
DoStuff(GetType(Integer), New Integer(){1,2,3})
Public Sub DoStuff(ByVal type as System.Type, ByVal value as Object)
//Strongly types arr as Integer()
Dim arr = SomeCast(type, value)
For Each i in arr
//Do something with i
Next
End Sub
编辑好的,我想我会添加更多细节,以便您可以看到我正在尝试做的事情。我有一个对象捕获从另一个页面返回的值。一旦我捕获它们,我想循环遍历'Values'属性。因此,将在'Values'中为每个字典对象调用上面的DoStuff()。如果字典objct中的值是一个数组,我也想循环它。我将通过泛型函数调用添加的类型保存为System.Type,但也许这不是可行的方法。我怎么写这个,这样我可以保存数组的类型并在以后循环遍历数组?
Public Class PopUpReturnValues
Implements IPopUpReturnValues
Public Sub AddValue(Of T As Structure)(ByVal name As String, ByVal value As T) Implements IPopUpReturnValues.AddValue
_values.Add(name, New PopUpReturnValue() With {.UnderlyingType = GetType(T), .Value = value, .IsArray = False})
End Sub
Public Sub AddArray(Of T As Structure)(ByVal name As String, ByVal values As T()) Implements IPopUpReturnValues.AddArray
_values.Add(name, New PopUpReturnValue() With {.UnderlyingType = GetType(T), .Value = values, .IsArray = True})
End Sub
Public Sub AddStringValue(ByVal name As String, ByVal value As String) Implements IPopUpReturnValues.AddStringValue
_values.Add(name, New PopUpReturnValue() With {.UnderlyingType = GetType(String), .Value = value, .IsArray = False})
End Sub
Public Sub AddStringArray(ByVal name As String, ByVal values As String()) Implements IPopUpReturnValues.AddStringArray
_values.Add(name, New PopUpReturnValue() With {.UnderlyingType = GetType(String), .Value = values, .IsArray = True})
End Sub
Private _values As New Dictionary(Of String, PopUpReturnValue)
Public ReadOnly Property Values() As IDictionary(Of String, PopUpReturnValue)
Get
Return _values
End Get
End Property
Public Class PopUpReturnValue
Public UnderlyingType As Type
Public Value As Object
Public IsArray As Boolean
End Class
End Class
答案 0 :(得分:2)
评论移至每个OP的答案
你的“做某事”代码基于我假设的类型,String vs Int vs Apple,它需要使用If语句处理所有三种类型。只需包含这三种类型的重载,您实际上不需要传递类型信息。但是,如果它只是调用ToString(),那么只需使用一个Object数组。
如果你不喜欢重载,只需使用TypeOf运算符来检查数组的值。当你将一个Integer抛入一个Object数组时,它仍然是一个Integer,只是一个盒装的。
答案 1 :(得分:0)
编译时是否知道类型?如果是这样,也许你可以使用泛型。
答案 2 :(得分:0)
您可以提供Action
,如下所示:
Public Sub DoStuff(ByVal value As Array, ByVal process As Action(Of Object) )
For Each item In value
process(item)
Next item
End Sub
然后你只需要一个方法,为你关心的每个类型提供一个参数,并知道如何将对象转换为该类型。然后调用DoStuff()
传递该方法的地址。如果你愿意,你甚至可以使用lambda。