Итерация по общему списку неизвестного типа во время выполнения в VB.Net - PullRequest
2 голосов
/ 06 ноября 2008

Кто-нибудь знает, как перебирать общий список, если тип этого списка неизвестен до времени выполнения?

Например, предположим, что 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().

Ответы [ 2 ]

2 голосов
/ 06 ноября 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.

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

1 голос
/ 06 ноября 2008

Если вы знаете, что obj является универсальным списком . Тогда тебе повезло.

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

  • IList имеет свойство count.
  • В IList также есть метод Cast. Если вы не знаете тип, к которому хотите привести объект, используйте объект. Это даст вам IEnumerable (Of object), с которым вы затем сможете начать использовать Linq.
...