VB.Netの実行時に不明なタイプの汎用リストを反復処理する
-
06-07-2019 - |
質問
一般的なリストのタイプが実行時までわからない場合、そのリストを反復処理する方法を知っていますか?
たとえば、 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では、コードが少し複雑になります。
リストにあるオブジェクトに特定のインターフェースを実装していれば、同じことが実現できます。こうすると、インターフェイスを実装している限り、任意のオブジェクトタイプをリストに追加できます。反復メソッドは、オブジェクトタイプ間の共通値でのみ機能します。
所属していません StackOverflow