Выполните итерацию по общему списку неизвестного типа во время выполнения в VB.Net
-
06-07-2019 - |
Вопрос
Кто-нибудь знает, как выполнить итерацию по общему списку, если тип этого списка неизвестен до времени выполнения?
Например, предположим, что 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()
.
Решение
Если вы знаете, что obj - это Общий список.Тогда вам повезло.
Универсальный список реализует IList и IEnumerable (оба не являются универсальными).Таким образом, вы могли бы выполнить приведение к любому из этих интерфейсов, а затем для каждого из них.
- IList имеет свойство count .
- У IList также есть метод приведения.Если вы не знаете, к какому типу приводить, используйте object .Это даст вам IEnumerable (объекта), с которым затем вы можете начать использовать Linq.
Другие советы
Метод, который перебирает ваш список, может указывать универсальный тип:
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. Р>
То же самое можно сделать, если у вас есть объекты в списке, реализующие определенный интерфейс. Таким образом, вы можете заполнить список любым типом объекта, если он реализует интерфейс, итерационный метод будет работать только с общими значениями между типами объектов.