2009-03-10 16 views
42
私は次のキャストを実行しようとしています。

受信したオブジェクトをList <object>またはIEnumerable <object>にキャスト

private void MyMethod(object myObject) 
{ 
    if(myObject is IEnumerable) 
    { 
     List<object> collection = (List<object>)myObject; 
     ... do something 
    } 
    else 
    { 
     ... do something 
    } 
} 

しかし、私はいつも次の例外で終わります:

タイプ 'System.Collections.Generic.List 1[MySpecificType]' to type 'System.Collections.Generic.Listのオブジェクトをキャストできません。オブジェクト] '

このメソッドは、単一のオブジェクトとコレクションの両方を指定するために非常に汎用的である必要があるため、これは本当に必要です。

これは可能か、これを達成する別の方法です。

ありがとうございます。

答えて

50

C#4は、共変と反変テンプレートパラメータを持っていますが、それまで、あなたは非ジェネリック何かをしなければならないような

IList collection = (IList)myObject; 
+0

ありがとうございます。これはそれでした。 –

+1

@Sergioランタイムエラーの危険を避けるには、キャストする前にmyObjectがIEnumerableではなくIListを実装していることを確認する必要があります。組み込みのコレクションの多くはIEnumerableを実装していますが、IListでは実装していません(Dictionary <>、HashSet <>、Hashtable、Queue、Stackなど)。 – LukeH

+0

@ルーク:それがリスト(質問に暗示されている)であれば、IListを実装します。 – erikkallen

2

しかし、あなたは、LINQを使用してこれを実現することができます

var result = ((IEnumerable)myObject).Cast<object>().ToList(); 
46

+0

これも機能します。ありがとうございました。 –

+2

これは元のものをキャストするのではなく、新しいリストを作成しています。 –

6

あなたが実際に必要ですプレーンIEnumerableより多くの情報はあなたに与えますか?それにキャストし、foreachを使ってください。私はプロトコルバッファのいくつかのビットで全く同じ状況に直面しており、IEnumerable(またはリストのようにそれにアクセスするにはIList)へのキャストがうまく機能することがわかりました。

9

問題は、より豊かなオブジェクトにアップキャストしようとしていることです。あなたは、単に新しいリストに項目を追加する必要があります。

if (myObject is IEnumerable) 
{ 
    List<object> list = new List<object>(); 
    var enumerator = ((IEnumerable) myObject).GetEnumerator(); 
    while (enumerator.MoveNext()) 
    { 
     list.Add(enumerator.Current); 
    } 
} 
+0

はこの作品ですか? –

0

このコードは

List<Object> collection = new List<Object>((IEnumerable<Object>)myObject); 
1

が楽しみに参加する必要が私のために働いた...

private void TestBench() 
    { 
     // An object to test 
     string[] stringEnumerable = new string[] { "Easy", "as", "Pi" }; 

     ObjectListFromUnknown(stringEnumerable); 
    } 

    private void ObjectListFromUnknown(object o) 
    { 
     if (typeof(IEnumerable<object>).IsAssignableFrom(o.GetType())) 
     { 
      List<object> listO = ((IEnumerable<object>)o).ToList(); 
      // Test it 
      foreach (var v in listO) 
      { 
       Console.WriteLine(v); 
      } 
     } 
    } 
0

あなたが入力する必要がありますを使用して、このような演算子としてキャストします。

private void MyMethod(object myObject) 
{ 
if(myObject is IEnumerable) 
{ 
    List<object> collection = myObject as(List<object>); 
    ... do something 
} 
else 
{ 
    ... do something 
} 
}  
関連する問題