2008-11-06 165 views
2

運行未知類型的泛型列表有誰知道,如果該列表的類型不知道,直到運行時如何遍歷一個泛型列表?迭代通過在VB.Net

例如,假設obj1被傳遞給函數作爲Object

Dim t As Type = obj1.GetType 
If t.IsGenericType Then 
    Dim typeParameters() As Type = t.GetGenericArguments() 
    Dim typeParam As Type = typeParameters(0) 
End If 

如果obj被作爲List(Of String)傳遞然後使用上述我可以確定一個通用的列表(t)傳遞和那它的類型爲StringtypeParam)。我知道我正在做一個大的假設,那就是隻有一個泛型參數,但這對於這個簡單的例子來說很好。

我想知道的是,基於上述情況,我怎麼做這樣的事情:

For Each item As typeParam In obj1 
    'do something with it here 
Next 

甚至一些爲獲得obj1.Count()一樣簡單。

回答

1

如果你知道obj爲Generic List。那麼你很幸運。

泛型列表實現IList和IEnumerable(均爲非通用)。所以你可以投到這兩個接口中的任何一個,然後對其中的每一個接口。

  • 的IList有一個Count屬性。
  • IList也有Cast方法。如果您不知道要投射的類型,請使用對象。這會給你一個IEnumerable(Of對象),你可以開始使用Linq。
2

,超過你的列表上循環可以指定一個泛型類型的方法:

Public Sub Foo(Of T)(list As List(Of T)) 
    For Each obj As T In list 
    ..do something with obj.. 
    Next 
End Sub 

,那麼你可以撥打:

Dim list As New List(Of String) 
Foo(Of String)(list) 

這種方法使得代碼看起來有點毛茸茸的,在至少在VB.NET中。

同樣的事情可以,如果你有一個在列表中的對象實現一個特定的接口來實現。這樣,只要它們實現了接口,就可以用任何對象類型填充列表,迭代方法只能處理對象類型之間的通用值。