代码之家  ›  专栏  ›  技术社区  ›  adam0101

将对象变量中的数组强制转换为System.Type变量中的类型

  •  0
  • adam0101  · 技术社区  · 14 年前

    我有这个功能:

    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”中的每个dictionary对象,将调用上面的dostuff()。如果dictionary 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 回复  |  直到 14 年前
        1
  •  2
  •   Chris Haas    14 年前

    每个操作的答案的注释

    您的“做点什么”代码基于我假定的类型,string与int与apple,它需要用if语句处理所有三种类型。只需为这三种类型包含一个重载,实际上不需要传递类型信息。但是,如果它只是调用toString(),那么只使用一个对象数组。

    如果不喜欢重载,只需使用typeof运算符检查数组的值。当您向对象数组中抛出一个整数时,它仍然是一个整数,只是一个装箱的整数。

        2
  •  0
  •   Etienne de Martel    14 年前

    编译时已知类型吗?如果是这样,也许你可以使用仿制药。

        3
  •  0
  •   Joel Coehoorn    14 年前

    您可以提供 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。