2010-04-14 19 views
0

我有這樣的功能:角色陣列可以鍵入的System.Type可變

Public Sub DoStuff(ByVal type as System.Type, ByVal value as Object) 

End Sub 

在「值」參數始終是相同類型的「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'屬性。所以上面的DoStuff()將會在'Values'中爲每個字典對象調用。如果字典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

這並非完全可能,並不完全合理。你想做什麼? – SLaks 2010-04-14 17:48:56

+0

有很少的情況,我曾經見過System.Type應該在反射之外使用。即使在我們使用泛型之前,仍然有更好的方法來做你可能做的事情。 – 2010-04-14 18:03:58

+0

好的...他們是什麼? – adam0101 2010-04-14 18:07:05

回答

2

評論搬到答案每個操作的基礎上我想類型,字符串VS詮釋VS蘋果,那就需要處理所有三種類型與if語句

你「做什麼」的代碼。只要包含這三種類型的重載,你實際上不需要傳遞類型信息。但是,如果它只是調用ToString(),那麼只需使用Object數組。

如果您不喜歡重載,只需使用TypeOf運算符來檢查數組的值。當你將一個Integer放入一個Object數組中時,它仍然是一個Integer,只是一個盒子。

0

編譯時已知類型?如果是這樣,也許你可以使用泛型。

+0

我在這個問題中增加了更多細節。希望我更清楚。 – adam0101 2010-04-14 18:06:06

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。