在VB.Net中在运行时迭代未知类型的通用列表

时间:2008-11-06 18:03:35

标签: vb.net generics ienumerable

如果在运行时之前不知道该列表的类型,是否有人知道如何迭代通用列表?

例如,假设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),它的类型为String({ {1}})。我知道我假设只有一个通用参数,但这对于这个简单的例子来说很好。

我想知道的是,基于以上所述,我该如何做这样的事情:

typeParam

甚至可以像获取For Each item As typeParam In obj1 'do something with it here Next 一样简单。

2 个答案:

答案 0 :(得分: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中是这样。

如果列表中的对象实现了特定的接口,则可以完成同样的事情。这样,只要它们实现了接口,就可以使用任何对象类型填充列表,迭代方法只能处理对象类型之间的公共值。

答案 1 :(得分:1)

如果您知道obj是Generic List。那你很幸运。

通用列表实现IList和IEnumerable(两者都是非泛型的)。所以你可以转换到其中任何一个接口,然后转换为For Each。

  • IList有一个计数属性。
  • IList也有一个Cast方法。如果您不知道要转换的类型,请使用object。这将为您提供一个IEnumerable(Of对象),然后您可以开始使用Linq。