2

そのリストのタイプが実行時までわからない場合、ジェネリックリストを反復処理する方法を知っている人はいますか?

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

私が知りたいのは、上記に基づいて、次のようなことをどのように行うかです。

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

または、取得するのと同じくらい簡単なものでもobj1.Count()

4

2 に答える 2

2

リストを反復処理するメソッドは、ジェネリック型を指定できます。

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 では、コードが少し複雑になります。

リストにあるオブジェクトが特定のインターフェースを実装している場合、同じことが実現できます。そうすれば、インターフェイスを実装している限り、リストに任意のオブジェクト タイプを入力できます。反復メソッドは、オブジェクト タイプ間の共通の値に対してのみ機能します。

于 2008-11-06T18:40:29.320 に答える
1

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

Generic Listは、IListとIEnumerableを実装します(どちらもジェネリックではありません)。したがって、これらのインターフェイスのいずれかにキャストしてから、それらを介してForEachにキャストできます。

  • IListにはcountプロパティがあります。
  • IListにはCastメソッドもあります。キャスト先のタイプがわからない場合は、オブジェクトを使用してください。これにより、IEnumerable(Ofオブジェクト)が提供され、Linqの使用を開始できます。
于 2008-11-06T18:15:37.140 に答える