リフレクションを使用して、アイテムの反復可能なリストにキャストする必要があるオブジェクトがあります(タイプは不明、オブジェクトになります)。 [ウォッチ]ウィンドウを使用すると、オブジェクトの数がわかるため、オブジェクトが何らかのタイプの配列であり、ツリービューを展開して要素自体を表示できます。
最初に、渡されたオブジェクトが何らかの種類の配列(Listの場合もあり、object []の場合もあるなど)であることを確認する必要があります。次に、その配列を反復処理する必要があります。ただし、型の変換はできません。
使用方法(略称)は次のとおりです。
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です。保存される実際のインスタンスは厳密に型指定されたList <>ですが、必要に応じてフォームの限定されたサブセットを取ることができます。しかし、演習のポイントは、このExample()メソッドがプロパティの基本タイプを知らないことです。
ArrayListへのキャストは、オブジェクトが実際にis ArrayListである場合にのみ機能します。 System.ArrayやSystem.Collections.Generic.List`1などでは機能しません。
あなたが実際にすべきことは、それをIEnumerableにキャストすることだと思います、それはそれをループするためのあなたの唯一の要件だからです...
object anArray = propInfo.GetValue(instance, null);
IEnumerable enumerable = anArray as IEnumerable;
if (enumerable != null)
{
foreach(object element in enumerable)
{
// etc...
}
}
IEnumerable
にキャストしてみてください。これは、すべての列挙型、配列、リストなどが実装する最も基本的なインターフェイスです。
IEnumerable myList = anArray as IEnumerable;
if (myList != null)
{
foreach (object element in myList)
{
// ... do something
}
}
else
{
// it's not an array, list, ...
}
単にこれを試してください
string[] arr = ((IEnumerable)yourOjbect).Cast<object>()
.Select(x => x.ToString())
.ToArray();
これを試して:
var myList = anArray as IEnumerable;
if (mylist != null)
{
foreach (var element in myList)
{
// etc
}
}
状況に応じて、IEnumerableのジェネリック型を指定する必要がある場合もあります。
並べ替え(配列、リストなど)のコレクションである場合、IEnumerable
にキャストできるはずです。また、PropertyInfo
にはPropertyType
プロパティが含まれています。このプロパティを使用して、必要に応じて実際の型を見つけることができます。