IEnumerable(Of T) is a huge step up in the 2.0 framework from the original IEnumerable interface. It provides a typed enumeration which eliminates lots of nasty casts. The best part is that IEnumerable(Of T) is backwards compatible with IEnumerable (it inherits from it).
What’s frustrating is that IEnumerable is not forwards compatible with IEnumerable(Of Object). This prevents you from using IEnumerable anywhere IEnumerable(Of Object) or an inferred IEnumerable
The good news is this is easy to shim. Since IEnumerable(Of Object) and IEnumerable have virtually the same, it’s easy to create a wrapper class that forwards the calls into the base enumerator.
The basic shim involves two classes
- EnumerableShim - Implements IEnumerable(Of Object). This class wraps an IEnumerable object only has two methods.
Public Function GetEnumerator() As System.Collections.Generic.IEnumerator(Of Object) Implements System.Collections.Generic.IEnumerable(Of Object).GetEnumerator
Return New EnumeratorShim(m_enumerable.GetEnumerator())
End Function
Public Function GetEnumerator1() As System.Collections.IEnumerator Implements System.Collections.IEnumerable.GetEnumerator
Return m_enumerable.GetEnumerator()
End Function
- EnumeratorShim - Implements IEnumerator(Of Object). This class wraps the IEnumerator object created above and implements the standard methods by forwarding all calls to the IEnumerator implementation. For example …
Public ReadOnly Property Current() As Object Implements System.Collections.Generic.IEnumerator(Of Object).Current
Get
Return m_impl.Current
End Get
End Property
Now whenever your stuck with and old framework collection that was not updated for generic support, you can use it in generic situations with a single indirection call.
Dim list As New ArrayList
...
SomeMethod(New EnumerableShim(list))