2011-01-08 8 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

+0

@Ani:私はDictionary 型の混在オブジェクトを含んでいます。それらのいくつかは列挙可能です。私は彼らの正確なタイプを知らなくても、それらのループをどのようにループできるかを理解しようとしています。 – mpen

答えて

15

それは、具体的なユースケースなしでこれに答えるのは難しいですが、あなたはそれは十分単純にキャストするかもしれません非汎用のIEnumerableインターフェイス

「シーケンス」と見なされるほとんどのタイプで通常これが動作する理由は2つあります。

  1. "古典的な" .NET 1.xコレクションクラスは、IEnumerableを実装しています。
  2. ジェネリックIEnumerable<T>インタフェースはIEnumerableから継承し、そのキャストは、System.Collections.GenericにおけるジェネリックコレクションクラスのためのLINQのシーケンスを正常に動作する必要がありますなど

EDIT

理由についてあなたの提供されたサンプルは動作しません:

  1. これはC#3では動作しません。一般的なインターフェイスの共分散をサポートしていないからです。IEnumerable<Derived>IEnumerable<Base>としてください。 int[]からキャスト(IEnumerable<int>- - >IEnumerable<object>が成功することはできません
  2. これは分散が価値型でサポートされていないためIEnumerable<T>は、共変であるという事実にもかかわらず、C#4のいずれかで動作しないでしょう。
+0

ああ...「IEnumerable 」でなければならないと思った。これがうまくいけば、なぜIEnumerable 'が動作しないのでしょうか?... wait ... nevermind。これは 'IEnumerable 'です。これは全く異なっています。私は今参照してください。ありがとうございました! – mpen

+0

IEnumerable はIEnumerableを実装していますので、常に下向きにキャストすることができます –

+1

@Pauli:はい、問題は、 'int []'が 'IEnumerable 'をまったく実装していないことです... 'IEnumerable 'それは同じではありません。しかし、単純に 'IEnumerable'がそのトリックを行います。 – mpen

14

私は値型をサポートしていない共分散と同じ問題に走った、私はList<Guid>objectとし、実際の型を持っていたとIEnumerable<object>を必要としていました。 IEnumerableだけでは不十分な場合にIEnumerableを生成する方法は、linq Castメソッドを使用することです。

((IEnumerable)lhsValue).Cast<object>() 
関連する問題