2011-06-22 12 views
20

リフレクションを使用して、アイテムの反復可能なリスト(型不明、オブジェクト)にキャストする必要があるオブジェクトがあります。ウォッチウィンドウを使用すると、オブジェクトがいくつかの型の配列であることがわかります。要素の数が分かり、ツリービューを展開して要素自体を見ることができます。C#オブジェクトへの配列

まず、渡されたオブジェクトが何らかの配列(List、オブジェクト[]など)であることを確認する必要があります。それから、その配列を繰り返し処理する必要があります。しかし、私は型変換を行うことはできません。ここで

は(省略)私はそれを使用している方法は次のとおりです。

private static void Example(object instance, PropertyInfo propInfo) 
    { 
     object anArray = propInfo.GetValue(instance, null); 
     ArrayList myList = anArray as ArrayList; 
     foreach (object element in myList) 
     { 
      // etc 
     } 
    } 

私は、様々な異なるキャストを試してみました。上記は例外を発生させませんが、anArrayが実際に存在し、項目を含んでいる場合、mylistはnullです。実際に保存されるインスタンスは、厳密に型指定されたリスト<>ですが、必要に応じてフォームの一部しか使用できません。しかし、演習のポイントは、このExample()メソッドはプロパティの基本型を知らないということです。

+0

をお試しください'if(instance.GetType()がIEnumerable)' – Tsar

+1

@Bad Display Nameは、* is *キーワードがどのように動作するか、System.TypeからSystem.Collection.IEnumerableにキャストしようとしています。 System.Typeはそのインタフェースを実装していないため、動作しません。 ** typeof(IEnumerable).IsAssignableFrom(instance.GetType())** – MattDavey

答えて

41

は唯一のオブジェクトが実際に ArrayListのであれば動作するように起こっています。それはSystem.Array、またはSystem.Collections.Generic.List`1で動作しません。

私は

object anArray = propInfo.GetValue(instance, null); 
IEnumerable enumerable = anArray as IEnumerable; 
if (enumerable != null) 
{ 
    foreach(object element in enumerable) 
    { 
     // etc... 
    } 
} 
+0

すごく早く仕事ができます!ありがとう。 – GeoffM

+1

他の人にも感謝します。 – GeoffM

14

IEnumerableにキャストしようとしてください。これは、すべての列挙型、配列、リストなどが実装する最も基本的なインタフェースです。 ArrayListにそれをキャスト

IEnumerable myList = anArray as IEnumerable; 
if (myList != null) 
{ 
    foreach (object element in myList) 
    { 
     // ... do something 
    } 
} 
else 
{ 
    // it's not an array, list, ... 
} 
1

はこれを試してみてください...それはそれをループにあなたの唯一の要件であるので、あなたが実際には、IEnumerableをにキャストされて何をすべきかを考える:

var myList = anArray as IEnumerable; 
    if (mylist != null) 
    { 
     foreach (var element in myList) 
     { 
      // etc 
     } 
    } 

あなたはまたかもしれません状況に応じて、IEnumerableの汎用タイプを指定する必要があります。それはどんな種類(配列、リスト、など)のコレクションがある場合

1

あなたはIEnumerableにキャストすることができるはずです。また、PropertyInfoにはPropertyTypeというプロパティが含まれています。これを使用して実際のタイプを調べることができます。

1

単純例えば、あなたがinstance.GetType(からオブジェクトの種類を見つけることができます)と、あなたは `is`を使用してdesirebaleタイプとそれを比較することができます。この

string[] arr = ((IEnumerable)yourOjbect).Cast<object>() 
          .Select(x => x.ToString()) 
          .ToArray(); 
関連する問題