2011-01-08 140 views
10

我如何投objectIEnumerable<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(); 
} 
+0

你想用它做什麼?你能舉一個例子嗎? – Ani 2011-01-08 04:24:58

+0

@Ani:我有一個Dictionary 包含一堆混合類型的對象。其中一些是可枚舉的。我試圖弄清楚如何在不知道確切類型的情況下循環播放這些內容。 – mpen 2011-01-08 04:27:22

回答

15

很難回答這個問題沒有一個具體的用例,但你可能發現它足夠簡單地轉換爲非通用IEnumerable接口。

爲什麼這通常適用於被認爲是「序列」的大多數類型有兩個原因。

  1. 「經典」.NET 1.x集合類實現IEnumerable
  2. 通用IEnumerable<T>接口從IEnumerable繼承,所以劇組應該正常工作在System.Collections.Generic泛型集合類,LINQ序列等

編輯

至於爲什麼您提供的示例不起作用:

  1. 這不適用於C#3,因爲它不支持通用接口協方差 - 您無法查看IEnumerable<Derived>作爲IEnumerable<Base>。從int[]投(一個IEnumerable<int>- - >IEnumerable<object>不能成功
  2. 這不會盡管IEnumerable<T>是協變的,因爲方差不支持值類型C#4無論是在工作。
14

我遇到了與協方差不支持的值類型相同的問題,我有一個object的與實際類型的List<Guid>,需要一個IEnumerable<object>。 IEnumerable生成IEnumerable的一種方式就是使用linq Cast方法

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