2008-11-06 166 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中。

同样的事情可以,如果你有一个在列表中的对象实现一个特定的接口来实现。这样,只要它们实现了接口,就可以用任何对象类型填充列表,迭代方法只能处理对象类型之间的通用值。