Iteration durch generische Liste von unbekanntem Typ zur Laufzeit in VB.Net
-
06-07-2019 - |
Frage
Wer weiß, wie eine generische Liste iterieren, wenn der Typ dieser Liste nicht erst zur Laufzeit bekannt ist?
Zum Beispiel sei angenommen obj1
in eine Funktion als Object
übergeben:
Dim t As Type = obj1.GetType
If t.IsGenericType Then
Dim typeParameters() As Type = t.GetGenericArguments()
Dim typeParam As Type = typeParameters(0)
End If
Wenn obj
als List(Of String)
geben wird dann die oben verwendet, kann ich feststellen, dass eine generische Liste (t
) übergeben wurde und dass es vom Typ String
(typeParam
). Ich weiß, dass ich eine große Annahme, dass es nur ein generischer Parameter, aber das ist in Ordnung für dieses einfache Beispiel.
Was ich möchte, ist wissen, basierend auf der oben, wie ich so etwas tun, tun:
For Each item As typeParam In obj1
'do something with it here
Next
oder sogar etwas so einfach wie obj1.Count()
bekommen.
Lösung
Wenn Sie wissen, dass obj ist ein Allgemein Liste . Dann haben Sie Glück.
Allgemeine Liste implementiert IList und IEnumerable (beide sind nicht-generic). So konnte man auf eine dieser Schnittstellen gegossen und dann für jede über sie.
- IList hat eine Eigenschaft count.
- IList hat auch ein Gussverfahren. Wenn Sie nicht die Art kennen zu werfen, verwendet Objekt. Dies wird Ihnen ein IEnumerable (Of Objekt), die Sie dann gegen die Verwendung von Linq beginnen.
Andere Tipps
Die Methode, die iteriert über die Liste einen generischen Typen angeben:
Public Sub Foo(Of T)(list As List(Of T))
For Each obj As T In list
..do something with obj..
Next
End Sub
So können Sie anrufen:
Dim list As New List(Of String)
Foo(Of String)(list)
Diese Methode macht den Code schauen ein wenig haarig, zumindest in VB.NET.
Das gleiche kann erreicht werden, wenn Sie die Objekte, die eine bestimmte Schnittstelle in der Liste implementieren sind. Auf diese Weise können Sie die Liste mit jedem Objekttyp besiedeln können, solange sie die Schnittstelle implementieren, die Iterationsmethode nur auf den gemeinsamen Werten zwischen den Objekttypen funktionieren würde.