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

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

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 object), с которого вы можете начать использовать 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.

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