Itérer dans la liste générique de type inconnu au moment de l'exécution en VB.Net

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

  •  06-07-2019
  •  | 
  •  

Question

Quelqu'un sait-il comment parcourir une liste générique si le type de cette liste n'est pas connu avant l'exécution?

Par exemple, supposons que obj1 soit transmis à une fonction en tant que Objet :

Dim t As Type = obj1.GetType
If t.IsGenericType Then
    Dim typeParameters() As Type = t.GetGenericArguments()
    Dim typeParam As Type = typeParameters(0)
End If

Si obj est passé en tant que List (Of String) , à l'aide de ce qui précède, je peux déterminer qu'une liste générique ( t ) a été passé et qu'il est de type String ( typeParam ). Je sais que je pars du principe qu'il n'y a qu'un seul paramètre générique, mais c'est très bien pour cet exemple simple.

Ce que j'aimerais savoir, c’est ce qui précède: comment puis-je faire quelque chose comme cela:

For Each item As typeParam In obj1
    'do something with it here
Next

Ou même quelque chose d'aussi simple que d'obtenir obj1.Count () .

Était-ce utile?

La solution

Si vous savez que obj est une liste générique . Alors vous avez de la chance.

Generic List implémente IList et IEnumerable (les deux ne sont pas génériques). Ainsi, vous pouvez lancer l'une ou l'autre de ces interfaces, puis For Each sur elles.

  • IList a une propriété count.
  • IList a également une méthode Cast. Si vous ne connaissez pas le type à utiliser, utilisez object. Cela vous donnera un IEnumerable (Of object) sur lequel vous pourrez alors commencer à utiliser Linq.

Autres conseils

La méthode qui parcourt votre liste peut spécifier un type générique:

Public Sub Foo(Of T)(list As List(Of T))
  For Each obj As T In list
     ..do something with obj..
  Next
End Sub

Vous pouvez alors appeler:

Dim list As New List(Of String)
Foo(Of String)(list)

Cette méthode rend le code un peu poilu, du moins dans VB.NET.

La même chose peut être accomplie si les objets de la liste implémentent une interface spécifique. De cette façon, vous pouvez remplir la liste avec n’importe quel type d’objet tant qu’ils implémentent l’interface, la méthode d’itération ne fonctionnerait que sur les valeurs communes aux types d’objets.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top