mpen
mpen

Reputation: 282875

Cast object to IEnumerable<object>?

How can I cast an object to IEnumerable<object>?

I know that the object implements IEnumerable<object> but I don't know what type it is. It could be an array, a List<T>, or whatever.


A simple test case I'm trying to get working:

static void Main(string[] args)
{
    object arr = new[] { 1, 2, 3, 4, 5 };
    foreach (var item in arr as IEnumerable<object>)
        Console.WriteLine(item);
    Console.ReadLine();
}

Upvotes: 14

Views: 23753

Answers (2)

BrandonAGr
BrandonAGr

Reputation: 6017

I ran into the same issue with covariance not supporting value types, I had an object with and actual type of List<Guid> and needed an IEnumerable<object>. A way to generate an IEnumerable when just IEnumerable isn't good enough is to use the linq Cast method

((IEnumerable)lhsValue).Cast<object>()

Upvotes: 20

Ani
Ani

Reputation: 113402

It's hard to answer this without a concrete use-case, but you may find it sufficient to simply cast to the non-generic IEnumerable interface.

There are two reasons why this will normally work for most types that are considered "sequences".

  1. The "classic" .NET 1.x collection classes implement IEnumerable.
  2. The generic IEnumerable<T> interface inherits from IEnumerable, so the cast should work fine for the generic collection classes in System.Collections.Generic, LINQ sequences etc.

EDIT:

As for why your provided sample doesn't work:

  1. This wouldn't work in C# 3 because it doesn't support generic interface covariance - you can't view an IEnumerable<Derived> as an IEnumerable<Base>.
  2. This wouldn't work in C# 4 either despite the fact that IEnumerable<T> is covariant, since variance is not supported for value-types - the cast from int[] (an IEnumerable<int>) --> IEnumerable<object> can't succeed.

Upvotes: 16

Related Questions