2

如果直到运行时才知道该列表的类型,有谁知道如何迭代通用列表?

例如,假设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作为 a 传递,List(Of String)则使用上面的方法我可以确定t传递了一个通用列表 ( ) 并且它的类型是String( typeParam)。我知道我做了一个很大的假设,即只有一个通用参数,但这对于这个简单的示例来说很好。

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

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

甚至是像获取一样简单的东西obj1.Count()

4

2 回答 2

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 中是这样。

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

于 2008-11-06T18:40:29.320 回答
1

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

通用列表实现 IList 和 IEnumerable(两者都是非通用的)。因此,您可以强制转换为其中任何一个接口,然后通过它们进行 For Each。

  • IList 有一个计数属性。
  • IList 还有一个 Cast 方法。如果您不知道要转换的类型,请使用 object。这将为您提供一个 IEnumerable(Of object),然后您可以开始使用 Linq。
于 2008-11-06T18:15:37.140 回答