简体   繁体   中英

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();
}

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.

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>()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM