【问题标题】:Iterate through generic list of unknown type at runtime in VB.Net在 VB.Net 运行时遍历未知类型的通用列表
【发布时间】:2010-09-21 03:27:54
【问题描述】:

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

例如,假设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() 这样简单的事情。

【问题讨论】:

    标签: vb.net generics ienumerable


    【解决方案1】:

    遍历列表的方法可以指定一个泛型类型:

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

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

    【讨论】:

      【解决方案2】:

      如果你知道 obj 是 Generic List。那你就走运了。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-19
        • 1970-01-01
        相关资源
        最近更新 更多