在Object变量中转换数组以在System.Type变量中键入

时间:2010-04-14 17:43:50

标签: vb.net arrays casting

我有这个功能:

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

3 个答案:

答案 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。