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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top