Перебирать общий список неизвестного типа во время выполнения в 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) был передан и что он имеет тип String (typeParam). Я знаю, что делаю большое предположение, что существует только один универсальный параметр, но для этого простого примера это нормально.

Я хотел бы знать, основываясь на вышеизложенном, как мне сделать что-то вроде этого:

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

Или даже что-то столь же простое, как получение obj1.Count().


person Sean Gough    schedule 06.11.2008    source источник


Ответы (2)


Если вы знаете, что obj — это общий список. Тогда вам повезло.

Универсальный список реализует IList и IEnumerable (оба не являются универсальными). Таким образом, вы можете выполнить приведение к любому из этих интерфейсов, а затем к каждому из них.

  • IList имеет свойство count.
  • IList также имеет метод Cast. Если вы не знаете тип для приведения, используйте object. Это даст вам IEnumerable(Of object), с которым вы сможете начать использовать Linq.
person Amy B    schedule 06.11.2008

Метод, который выполняет итерацию по вашему списку, может указать общий тип:

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.

То же самое можно сделать, если у вас есть объекты в списке, реализующие определенный интерфейс. Таким образом, вы можете заполнить список любым типом объекта, пока они реализуют интерфейс, метод итерации будет работать только с общими значениями между типами объектов.

person Todd    schedule 06.11.2008