質問

一般的なリストのタイプが実行時までわからない場合、そのリストを反復処理する方法を知っていますか?

たとえば、 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 )であること。ジェネリックパラメーターは1つしかないという大きな仮定を立てていることは知っていますが、この単純な例ではそれで問題ありません。

私が知りたいのは、上記に基づいて、このようなことをする方法です:

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

または obj1.Count()を取得するような単純なものです。

役に立ちましたか?

解決

objが汎用リストであることを知っている場合。その後、あなたは運がいいです。

Generic ListはIListおよびIEnumerableを実装します(両方とも非ジェネリックです)。そのため、これらのインターフェースのいずれかにキャストしてから、それらの上にFor Eachをキャストできます。

  • IListにはcountプロパティがあります。
  • IListにはCastメソッドもあります。キャストする型がわからない場合は、オブジェクトを使用します。これにより、IEnumerable(Of object)が得られ、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