将对象转换为IEnumerable <object>?</object>

时间:2011-01-08 04:23:07

标签: c# casting

如何将object投射到IEnumerable<object>

我知道对象实现了IEnumerable<object>,但我不知道它是什么类型。它可以是一个数组,List<T>或其他任何内容。


一个简单的测试案例我正在努力工作:

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

2 个答案:

答案 0 :(得分:16)

如果没有具体的用例,很难回答这个问题,但是可能发现只需转换为非通用的IEnumerable接口就足够了。

对于大多数被视为“序列”的类型,这通常有两个原因。

  1. “经典”.NET 1.x集合类实现IEnumerable
  2. 泛型IEnumerable<T>接口继承自IEnumerable,因此转换应该适用于System.Collections.Generic,LINQ序列等中的泛型集合类。
  3. 修改

    至于为什么你提供的样本不起作用:

    1. 这在C#3中不起作用,因为它不支持通用接口协方差 - 您无法将IEnumerable<Derived>视为IEnumerable<Base>
    2. 尽管IEnumerable<T>是协变的,但这在C#4中不起作用,因为值类型不支持方差 - 来自int[]的转换(IEnumerable<int> - &gt; IEnumerable<object>无法成功。

答案 1 :(得分:14)

我遇到同样的问题,协方差不支持值类型,我有一个object,实际类型为List<Guid>,需要一个IEnumerable<object>。只有IEnumerable不够好才能生成IEnumerable的方法是使用linq Cast方法

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