Converting a IEnumerator to IEnumerator
October 11, 2009 by Daniel Hoelbling
When generics where introduced with .NET 2.0 there was a ton of 1.1 code lying around that was still built without generics. So the obvious answer by Microsoft was that most generic specialization classes can be cast to their non-generic counterparts to avoid problems for users.
Now, years later we have the opposite phenomenon. Few people are actually using untyped collections, so a new problem has come: What if you are looking at legacy code that has to call into new API that has no non-generic support.
Well, it’s simple: IEnumerator becomes IEnumerator
public class CastEnumerator<T> : IEnumerator<T>
{
private readonly IEnumerator enumerator;
public CastEnumerator(IEnumerator enumerator)
{
this.enumerator = enumerator;
}
public void Dispose()
{
}
public bool MoveNext()
{
return enumerator.MoveNext();
}
public void Reset()
{
enumerator.Reset();
}
public T Current
{
get { return (T)enumerator.Current; }
}
object IEnumerator.Current
{
get { return Current; }
}
}
The call then looks like this:
public IEnumerator<T> GetEnumerator()
{
return new CastEnumerator<T>(untypedEnumerator);
}
As Julian Birch explained in the comments, if you are using .NET 3.5 it’s even simpler to get from an untyped IEnumerable to a IEnumerable
IEnumerable untypedEnumerable = ...;
IEnumerable<string> typedEnumerable = untypedEnumerable.Cast<T>();