Выполните итерацию по общему списку неизвестного типа во время выполнения в VB.Net

StackOverflow https://stackoverflow.com/questions/269660

  •  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.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top